實(shí)驗(yàn)二 Linux進(jìn)程通信_(tái)第1頁(yè)
實(shí)驗(yàn)二 Linux進(jìn)程通信_(tái)第2頁(yè)
實(shí)驗(yàn)二 Linux進(jìn)程通信_(tái)第3頁(yè)
實(shí)驗(yàn)二 Linux進(jìn)程通信_(tái)第4頁(yè)
實(shí)驗(yàn)二 Linux進(jìn)程通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)驗(yàn)二 Linux進(jìn)程通信一、實(shí)驗(yàn)?zāi)康?)了解有關(guān)Linux系統(tǒng)調(diào)用;2)學(xué)習(xí)有關(guān)Linux的進(jìn)程創(chuàng)建,理解進(jìn)程創(chuàng)建后兩個(gè)并發(fā)進(jìn)程的執(zhí)行。二、實(shí)驗(yàn)內(nèi)容在Linux環(huán)境下,用C/C+語(yǔ)言編程,使用系統(tǒng)調(diào)用fork創(chuàng)建進(jìn)程多個(gè)子進(jìn)程。(1) 調(diào)試并完成下列程序,完成實(shí)驗(yàn)要求:#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.請(qǐng)說(shuō)出執(zhí)行這個(gè)程序后,將一共運(yùn)行幾個(gè)進(jìn)程。B.觀察運(yùn)行結(jié)果,并給出分析與解釋。答:A.執(zhí)行這個(gè)程序后,將一共運(yùn)行4個(gè)進(jìn)程。A.運(yùn)行結(jié)果如下:分析與解釋:fork()函數(shù)能夠建立子進(jìn)程,且使得子進(jìn)程得到父進(jìn)程地址空的一個(gè)復(fù)制;而且,當(dāng)創(chuàng)建成功時(shí),如果是父進(jìn)程則返回0,子進(jìn)程則返回子進(jìn)程的ID,但是,fork()創(chuàng)建的進(jìn)程并不是從該程序開(kāi)頭開(kāi)始執(zhí)行,它只是和父進(jìn)程一樣繼續(xù)執(zhí)行后續(xù)代碼,因此在之后的語(yǔ)句中,父子進(jìn)程同時(shí)創(chuàng)建一個(gè)進(jìn)程,就形成了四個(gè)進(jìn)程,如圖上所示。 所以,在上面的截圖中,第一次fork()

3、函數(shù)時(shí)成功產(chǎn)生了父子進(jìn)程pid分別為2775和0,第二次使用fork()函數(shù)時(shí)父子進(jìn)程又各產(chǎn)生了一對(duì)父子進(jìn)程父進(jìn)程產(chǎn)生的父子進(jìn)程的pid分別為2776和0,子進(jìn)程產(chǎn)生的父子進(jìn)程的pid分別為0和2777。因?yàn)檫M(jìn)程是并發(fā)的,他的調(diào)度我們無(wú)法干預(yù),所以出現(xiàn)的結(jié)果并非都是一成不變的,執(zhí)行多次后,輸出的順序有可能不一樣。(2)參考下面的相關(guān)程序?qū)嵗?,編?xiě)一個(gè)管道實(shí)驗(yàn)程序,實(shí)現(xiàn)兩個(gè)進(jìn)程之間的數(shù)據(jù)通信。要求:父進(jìn)程順序?qū)懭肴舾蓚€(gè)字符串,子進(jìn)程順序讀出內(nèi)容,并寫(xiě)入文件piple.txt,并顯示出來(lái)。(寫(xiě)出設(shè)計(jì)步驟、數(shù)據(jù)結(jié)構(gòu)、關(guān)鍵代碼、實(shí)驗(yàn)結(jié)果及其分析說(shuō)明)答:設(shè)計(jì)步驟:用pipe()創(chuàng)建一個(gè)管道fd,用fo

4、rk調(diào)用產(chǎn)生兩個(gè)進(jìn)程(父進(jìn)程和子進(jìn)程);將父進(jìn)程將要傳輸給子進(jìn)程的信息寫(xiě)在readbuffer;然后使子進(jìn)程通過(guò)讀端用write函數(shù)從緩存中讀取父進(jìn)程傳輸?shù)南?。?shù)據(jù)結(jié)構(gòu):定義一個(gè)字符數(shù)組string用于存放父進(jìn)程將要傳輸給子進(jìn)程的消息,使用read函數(shù)和write函數(shù)配對(duì)實(shí)現(xiàn)管道的運(yùn)行。關(guān)鍵代碼:#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(); 實(shí)驗(yàn)三 動(dòng)態(tài)分區(qū)管理方法一、實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)主要對(duì)操作系統(tǒng)中內(nèi)存管理方法及其應(yīng)用中的一些關(guān)鍵算法進(jìn)行模擬。學(xué)生通過(guò)設(shè)計(jì)與實(shí)現(xiàn)相關(guān)算法,能夠加強(qiáng)對(duì)相應(yīng)理論的理解,并對(duì)了解操作系統(tǒng)內(nèi)存管理子系統(tǒng)的相關(guān)處理原理與過(guò)程。二、實(shí)驗(yàn)要求基本要求:編碼實(shí)現(xiàn)動(dòng)態(tài)分區(qū)管理的三種分配算法和回收算法(相鄰空閑區(qū)要合并)。1)初始化:輸入若干個(gè)空閑分區(qū)和已占用分區(qū)信息,建

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

7、2) 最佳適應(yīng)算法 通常按照空間從小到大的次序排序。 當(dāng)用戶作業(yè)或進(jìn)程申請(qǐng)一個(gè)空閑區(qū)時(shí),從表頭開(kāi)始查找,找到第一個(gè)滿足要求的空閑區(qū)時(shí),即停止查找。即找到那個(gè)滿足大小且是最小的空閑區(qū),分割分配。123) 最壞適應(yīng)算法通常要求空閑區(qū)按其空間大小遞減排序。當(dāng)用戶作業(yè)或進(jìn)程申請(qǐng)一個(gè)空閑區(qū)時(shí),順序查找到第一個(gè)滿足要求的空閑區(qū)用來(lái)分配。即找到那個(gè)滿足大小且是最大的空閑區(qū),分割并分配。(2)動(dòng)態(tài)分區(qū)在去配時(shí),可能遇到4種情況: a) 該空閑區(qū)的上下兩相鄰分區(qū)都是空閑區(qū); b) 該空閑區(qū)的上相鄰區(qū)是空閑區(qū); c) 該空閑區(qū)的下相鄰區(qū)是空閑區(qū); d) 兩相鄰區(qū)都不是空閑區(qū)。1、 主要函數(shù)實(shí)現(xiàn)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( ); /*從文件中讀如數(shù)據(jù)*/void display_empty_table(int); /*顯示空閑區(qū)表*/void display_busy_table(int); /*顯示已分配區(qū)表*/void badest_fit( int *,int

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

10、據(jù)*/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 );/*這里可以改為最佳適應(yīng)和最先適應(yīng)*/first_fit( &num1,&num2,name,size );/*這里可以改為最佳適應(yīng)和最先適應(yīng)*/best_fit( &num1,&num2,name,size );/*這里可以改為最佳適應(yīng)和最先適應(yīng)*/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ǐng)的空間比最大的空閑區(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ǐng)的空間與空閑區(qū)恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s

16、;emptytemp.length-=s;/*最先適應(yīng)算法*/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; /*最佳適應(yīng)算法*/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ǐng)的空間比最大的空閑區(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ǐng)的空間與空閑區(qū)恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s;emptytemp.length-=s;2、 測(cè)試數(shù)據(jù)與結(jié)果分析最壞適應(yīng)法 badest_fit最佳適應(yīng)法 best_fit 四、實(shí)驗(yàn)總結(jié) 通過(guò)此次實(shí)驗(yàn),我實(shí)現(xiàn)了操作系統(tǒng)中內(nèi)存管理方法及其應(yīng)用中的一些關(guān)鍵算法進(jìn)行模擬,完成了實(shí)驗(yàn)?zāi)繕?biāo)。在設(shè)計(jì)與實(shí)現(xiàn)最先適應(yīng)法、最佳適應(yīng)法、最壞適應(yīng)法算法的過(guò)程中,加深了自己對(duì)這些算法如何進(jìn)行內(nèi)存的分配與回收的機(jī)制的相關(guān)理論的理解,并體會(huì)了操作系統(tǒng)內(nèi)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論