實驗二 Linux進程通信_第1頁
實驗二 Linux進程通信_第2頁
實驗二 Linux進程通信_第3頁
實驗二 Linux進程通信_第4頁
實驗二 Linux進程通信_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗二 Linux進程通信一、實驗目的1)了解有關Linux系統調用;2)學習有關Linux的進程創(chuàng)建,理解進程創(chuàng)建后兩個并發(fā)進程的執(zhí)行。二、實驗內容在Linux環(huán)境下,用C/C+語言編程,使用系統調用fork創(chuàng)建進程多個子進程。(1) 調試并完成下列程序,完成實驗要求:#include "stdio.h" #include "sys/types.h" #include "unistd.h" int main() pid_t pid1; pid_t pid2; pid1 = fork(); pid2 = fork(); printf(

2、"pid1:%d, pid2:%dn", pid1, pid2); 要求:A.請說出執(zhí)行這個程序后,將一共運行幾個進程。B.觀察運行結果,并給出分析與解釋。答:A.執(zhí)行這個程序后,將一共運行4個進程。A.運行結果如下:分析與解釋:fork()函數能夠建立子進程,且使得子進程得到父進程地址空的一個復制;而且,當創(chuàng)建成功時,如果是父進程則返回0,子進程則返回子進程的ID,但是,fork()創(chuàng)建的進程并不是從該程序開頭開始執(zhí)行,它只是和父進程一樣繼續(xù)執(zhí)行后續(xù)代碼,因此在之后的語句中,父子進程同時創(chuàng)建一個進程,就形成了四個進程,如圖上所示。 所以,在上面的截圖中,第一次fork()

3、函數時成功產生了父子進程pid分別為2775和0,第二次使用fork()函數時父子進程又各產生了一對父子進程父進程產生的父子進程的pid分別為2776和0,子進程產生的父子進程的pid分別為0和2777。因為進程是并發(fā)的,他的調度我們無法干預,所以出現的結果并非都是一成不變的,執(zhí)行多次后,輸出的順序有可能不一樣。(2)參考下面的相關程序實例,編寫一個管道實驗程序,實現兩個進程之間的數據通信。要求:父進程順序寫入若干個字符串,子進程順序讀出內容,并寫入文件piple.txt,并顯示出來。(寫出設計步驟、數據結構、關鍵代碼、實驗結果及其分析說明)答:設計步驟:用pipe()創(chuàng)建一個管道fd,用fo

4、rk調用產生兩個進程(父進程和子進程);將父進程將要傳輸給子進程的信息寫在readbuffer;然后使子進程通過讀端用write函數從緩存中讀取父進程傳輸的消息。數據結構:定義一個字符數組string用于存放父進程將要傳輸給子進程的消息,使用read函數和write函數配對實現管道的運行。關鍵代碼:#include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> int main(void) i

5、nt fd2, out; pid_t childpid; char string="abcdefghijklmnopqrstuvwxyz" char readbuffer27; pipe(fd); childpid=fork(); 實驗三 動態(tài)分區(qū)管理方法一、實驗目的本實驗主要對操作系統中內存管理方法及其應用中的一些關鍵算法進行模擬。學生通過設計與實現相關算法,能夠加強對相應理論的理解,并對了解操作系統內存管理子系統的相關處理原理與過程。二、實驗要求基本要求:編碼實現動態(tài)分區(qū)管理的三種分配算法和回收算法(相鄰空閑區(qū)要合并)。1)初始化:輸入若干個空閑分區(qū)和已占用分區(qū)信息,建

6、立空閑區(qū)表和已分配表。2)分配功能:輸入一個作業(yè)請求,可選最先、最佳和最壞算法實現該作業(yè)的內存分配;3)回收功能:輸入進入完成態(tài)的作業(yè),回收其占用的分區(qū),并進行檢查合并相鄰空閑分區(qū)。4)顯示當前分區(qū)情況:顯示已占用分區(qū)、空閑區(qū)表的內容。3、 實驗內容基本原理(1)動態(tài)分區(qū)時的分配方法有三種:最先適應法(first fit algorithm)最佳適應法(best fit algorithm)最壞適應法(worst fit algoriathm)1) 最先適應法 該法一般空閑區(qū)按起始地址遞增排列。 該算法的最大特點是查找簡單快速,但需要按地址排序。 即找到第一個滿足要求的低地址空閑區(qū),分割分配。

7、2) 最佳適應算法 通常按照空間從小到大的次序排序。 當用戶作業(yè)或進程申請一個空閑區(qū)時,從表頭開始查找,找到第一個滿足要求的空閑區(qū)時,即停止查找。即找到那個滿足大小且是最小的空閑區(qū),分割分配。123) 最壞適應算法通常要求空閑區(qū)按其空間大小遞減排序。當用戶作業(yè)或進程申請一個空閑區(qū)時,順序查找到第一個滿足要求的空閑區(qū)用來分配。即找到那個滿足大小且是最大的空閑區(qū),分割并分配。(2)動態(tài)分區(qū)在去配時,可能遇到4種情況: a) 該空閑區(qū)的上下兩相鄰分區(qū)都是空閑區(qū); b) 該空閑區(qū)的上相鄰區(qū)是空閑區(qū); c) 該空閑區(qū)的下相鄰區(qū)是空閑區(qū); d) 兩相鄰區(qū)都不是空閑區(qū)。1、 主要函數實現struct dat

8、a1 /*空閑區(qū)表*/int address;int length;int flag;struct data2 /*已分配區(qū)表*/int address;int length;char name20;struct data1 emptyMAX;struct data2 busyMAX;void initialize( );int read_data( ); /*從文件中讀如數據*/void display_empty_table(int); /*顯示空閑區(qū)表*/void display_busy_table(int); /*顯示已分配區(qū)表*/void badest_fit( int *,int

9、 *,char *name,int s );/*最壞適應算法*/void first_fit( int *,int *,char *name,int s ); /*最先適應算法*/void best_fit( int *,int *,char *name,int s ); /*最佳適應算法*/void main( )int num1,num2,size; /*num1用于統計空閑表的,num2用于統計分配區(qū)表*/char name20;num2=0;initialize( ); /*初始花空閑區(qū)表和分配區(qū)表*/num1=read_data( ); if( num1=0 ) /*表示文件中沒有數

10、據*/printf("there has no data in empty tablen");printf("the initialial empty table is:n");display_empty_table( num1 ); /*顯示空閑區(qū)表*/while(1)printf("please input job's name and job's sizen");puts("input exit to exit");scanf("%s",name);if( strcmp(n

11、ame,"exit")=0 )getch( );break;scanf("%d",&size);badest_fit( &num1,&num2,name,size );/*這里可以改為最佳適應和最先適應*/first_fit( &num1,&num2,name,size );/*這里可以改為最佳適應和最先適應*/best_fit( &num1,&num2,name,size );/*這里可以改為最佳適應和最先適應*/puts("the empty table after assigning

12、");display_empty_table( num1 );puts("the busy table:");display_busy_table( num2 );void initialize( )int i;for( i=0;i<MAX;i+ )emptyi.address=0;emptyi.length=0;emptyi.flag=0;busyi.address=0;busyi.length=0;strcpy(,"");int read_data( )FILE *fp;int n=0;fp=fopen("

13、;A.txt","rb");if( fp=NULL )void display_empty_table( int num )int i;printf("addresstlengthtflagn");for( i=0;i<num;i+ )printf("%dt%dt%dn",emptyi.address,emptyi.length,emptyi.flag);printf("n");void display_busy_table( int num )int i;printf("addresst

14、lengthtnamen");for( i=0;i<num;i+ )printf("%dt%dt%sn",busyi.address,busyi.length,);printf("n");void badest_fit( int *n1,int *n2,char *name,int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*尋找最大的空閑區(qū)*/if( emptyi.length>emptytemp.length)temp=i;if( s>emptytemp.

15、length) /*申請的空間比最大的空閑區(qū)還大*/printf("the size of memory is not enoughn");return;busy*n2.address=emptytemp.address;/*修改分配區(qū)表*/busy*n2.length=s;strcpy( busy*,name );(*n2)+;if( s=emptytemp.length ) /*若申請的空間與空閑區(qū)恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s

16、;emptytemp.length-=s;/*最先適應算法*/void first_fit( int *n1,int *n2,char *name,int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*尋找第一塊空閑區(qū)*/if( emptyi.length>=s )temp=i;break;if( i>=*n1)printf("the size of memory is not enoughn");return; /*最佳適應算法*/void best_fit( int *n1,int *n2,char *name,

17、int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*尋找最小的空閑區(qū)*/if( emptyi.length<emptytemp.length)temp=i;if( s>emptytemp.length) /*申請的空間比最大的空閑區(qū)還大*/printf("the size of memory is not enoughn");return;busy*n2.address=emptytemp.address;/*修改分配區(qū)表*/busy*n2.length=s;strcpy( busy*,name );

18、(*n2)+;if( s=emptytemp.length ) /*若申請的空間與空閑區(qū)恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s;emptytemp.length-=s;2、 測試數據與結果分析最壞適應法 badest_fit最佳適應法 best_fit 四、實驗總結 通過此次實驗,我實現了操作系統中內存管理方法及其應用中的一些關鍵算法進行模擬,完成了實驗目標。在設計與實現最先適應法、最佳適應法、最壞適應法算法的過程中,加深了自己對這些算法如何進行內存的分配與回收的機制的相關理論的理解,并體會了操作系統內

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論