北郵大三上操作系統(tǒng)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第1頁(yè)
北郵大三上操作系統(tǒng)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第2頁(yè)
北郵大三上操作系統(tǒng)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第3頁(yè)
北郵大三上操作系統(tǒng)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第4頁(yè)
北郵大三上操作系統(tǒng)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩17頁(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)介

wordPAGE..操作系統(tǒng)實(shí)驗(yàn)一進(jìn)程管理實(shí)驗(yàn) 班級(jí):2009211311學(xué)號(hào):姓名:schneeword..目錄1. 實(shí)驗(yàn)?zāi)康?32. 實(shí)驗(yàn)預(yù)備內(nèi)容 33. 環(huán)境說(shuō)明 34. 實(shí)驗(yàn)內(nèi)容 44.1. 進(jìn)程的創(chuàng)立 4程序1題目要求: 4程序設(shè)計(jì)說(shuō)明: 4源代碼: 4運(yùn)行結(jié)果: 5分析: 54.2. 進(jìn)程的控制 6程序2(a)題目要求: 6程序設(shè)計(jì)說(shuō)明: 6源代碼: 6運(yùn)行結(jié)果: 74.2.5分析: 7程序2(b)題目要求: 7程序設(shè)計(jì)說(shuō)明: 8源代碼: 8運(yùn)行結(jié)果: 9分析: 104.3. 進(jìn)程的軟中斷通信 11程序3(a)題目要求: 11程序設(shè)計(jì)說(shuō)明: 11源代碼: 12運(yùn)行結(jié)果: 14分析: 14程序3(b)題目要求: 14程序設(shè)計(jì)說(shuō)明: 14源代碼:(略) 15運(yùn)行結(jié)果及分析: 154.4. 進(jìn)程的管道通信 17程序4題目要求: 17程序設(shè)計(jì)說(shuō)明: 17源代碼: 17運(yùn)行結(jié)果: 19分析: 195. 思考 20實(shí)驗(yàn)?zāi)康募由顚?duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法了解Linux/windows系統(tǒng)中進(jìn)程通信的根本原理實(shí)驗(yàn)預(yù)備內(nèi)容閱讀Linux的sched.h源碼文件,加深對(duì)進(jìn)程管理概念的理解閱讀Linux的fork()源碼文件,分析進(jìn)程的創(chuàng)立過程環(huán)境說(shuō)明此實(shí)驗(yàn)采用的是Win7下虛擬機(jī)VMware-workstation-6.5.3-185404及kanas-ubuntu-10.10-desktop-i386。直接編寫文件在終端用命令行執(zhí)行。虛擬機(jī)分配8G內(nèi)存中的512M。操作尚未取得root權(quán)限。ubuntu用戶名jrayty。實(shí)驗(yàn)內(nèi)容進(jìn)程的創(chuàng)立程序一:題目要求:編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)立兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示字符“a〞,子進(jìn)程分別顯示字符“b〞和“c〞。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。程序設(shè)計(jì)說(shuō)明:此程序相對(duì)簡(jiǎn)單。詳見源代碼。4.1.3源代碼:#include<cstdio>#include<cstdlib>#include<unistd.h>#include<iostream>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>usingnamespacestd;intmain(){pid_tp1,p2;while((p1=fork())==-1);//createchildprogress1if(p1==0){putchar('b');//childprogress1print'b'exit(0);}else{while((p2=fork())==-1);//createchildprogress2if(p2==0){putchar('c');//childprogress2print'c'exit(0);}else {putchar('a');//parentprogressprint'a'exit(0);}}return0;}4.1.4運(yùn)行結(jié)果:4.1.5分析:從截圖可見運(yùn)行結(jié)果有abc,bac,acb等。這是因?yàn)槿齻€(gè)進(jìn)程間沒有同步措施,所以父進(jìn)程和兩個(gè)子進(jìn)程的輸出次序帶有隨機(jī)性。因此實(shí)際上三者的各種組合都可能出現(xiàn)。進(jìn)程的控制程序2.0:4.2.1題目要求:修改已經(jīng)編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析原因。程序設(shè)計(jì)說(shuō)明:直接改自第一個(gè)程序。其間加sleep()是為了標(biāo)準(zhǔn)下格式。詳見源代碼。4.2.3源代碼:#include<cstdio>#include<cstdlib>#include<unistd.h>#include<iostream>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>usingnamespacestd;intmain(){pid_tp1,p2;while((p1=fork())==-1);//createchildprogress1if(p1==0){puts("I'mtheChildProgress1!!!");exit(0);}else{while((p2=fork())==-1);//createchildprogress2if(p2==0){puts("I'mtheChildProgress2!!!");exit(0);}else {sleep(4);puts("I'mtheParentProgress!!!");//parentprogressexit(0);}}return0;}4.2.4運(yùn)行結(jié)果:4.2.5分析:可見運(yùn)行情況和第一個(gè)程序是很像的。雖然換成了字符串,但同一個(gè)進(jìn)程里puts字符串并不會(huì)被中斷。程序2:4.2.1題目要求:如果在程序中使用系統(tǒng)調(diào)用lockf()來(lái)給每一個(gè)進(jìn)程加鎖,可以實(shí)現(xiàn)進(jìn)程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。程序設(shè)計(jì)說(shuō)明:學(xué)習(xí)lockf()函數(shù)學(xué)了好久。。。程序中運(yùn)用了多個(gè)sleep()并且讓每個(gè)進(jìn)程多輸出了幾次,從而使結(jié)果更明顯。且讓父進(jìn)程休息較久,從而讓子進(jìn)程都執(zhí)行完。4.2.3源代碼:#include<cstdio>#include<cstdlib>#include<unistd.h>#include<iostream>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>usingnamespacestd;intmain(){pid_tp1,p2;inti;while((p1=fork())==-1);//createchildprogress1if(p1==0){lockf(1,1,0);//lockfor(i=0;i<4;i++){sleep(1);puts("I'mtheChildProgress1!!!");}lockf(1,0,0);//unlockexit(0);}else{while((p2=fork())==-1);//createchildprogress2if(p2==0){lockf(1,1,0);//lockfor(i=0;i<4;i++){sleep(1);puts("I'mtheChildProgress2!!!");}lockf(1,0,0);//unlockexit(0);}else { puts("I'mtheParentProgress!!!"); sleep(10); puts("I'mtheParentProgress!!!"); exit(0);}}return0;}4.2.4運(yùn)行結(jié)果:******************************************假設(shè)是去掉lockf(),那么運(yùn)行結(jié)果如下4.2.5分析: 從上面運(yùn)行結(jié)果可以看出。無(wú)論加不加鎖,兩個(gè)子進(jìn)程運(yùn)行的次序是隨機(jī)的。但是加鎖后一個(gè)進(jìn)程會(huì)全部輸出完了才轉(zhuǎn)給另一個(gè)進(jìn)程。從而我們可以看出lockf()對(duì)兩個(gè)進(jìn)程對(duì)標(biāo)準(zhǔn)輸出流的互斥使用。 lockf(fileno(fp),F_LOCK,0L)函數(shù)的第一個(gè)參數(shù)是加鎖的文件,上述程序用的是1,即標(biāo)準(zhǔn)輸出流;第二個(gè)參數(shù)是操作,1表示加鎖0表示解鎖。第三個(gè)參數(shù)是文件長(zhǎng)度,文中用0表示整個(gè)文件。進(jìn)程的軟中斷通信程序3:4.3.1題目要求:(a)使用系統(tǒng)調(diào)用fork()創(chuàng)立兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來(lái)的中斷信號(hào)〔即按Del/CTRL+C鍵〕.當(dāng)捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出以下信息后終止:ChildProcess1iskilledbyParent!ChildProcess2iskilledbyParent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下的信息后終止:ParentProcessiskilled!程序設(shè)計(jì)說(shuō)明:1〕題目解析和問題解決一,要求Del后引發(fā)父進(jìn)程的動(dòng)作。實(shí)際就是觸發(fā)軟中斷SIGINT。二,要求在中斷到來(lái)前兩子進(jìn)程處于等待狀態(tài),中斷到來(lái)后立刻動(dòng)作。對(duì)此,我自定義了兩個(gè)函數(shù)my_wait()函數(shù)和my_stop()函數(shù),通過對(duì)flag標(biāo)志位的操作來(lái)實(shí)現(xiàn)。flag為真時(shí)等待,中斷到來(lái)后通過my_stop()函數(shù)使flag改為假,從而退出等待的死循環(huán)。雖然這樣效率很低,但是在這個(gè)小程序里還是可以的。三,至于如何控制父進(jìn)程殺死子進(jìn)程后再自殺,我用了signal()函數(shù)預(yù)留給用戶自定義的10和12號(hào)信號(hào),即SIGUSR1和SIGUSR2。讓兩個(gè)子進(jìn)程分別監(jiān)聽這兩個(gè)信號(hào),父進(jìn)程被觸發(fā)后分別向兩個(gè)子進(jìn)程發(fā)出這兩個(gè)信號(hào)殺死他們,然后再退出即可。2〕知識(shí)點(diǎn)補(bǔ)充學(xué)習(xí)到的函數(shù)的定義。1〕軟中斷信號(hào)預(yù)置函數(shù)signal(sig,function)sig——系統(tǒng)給定的軟中斷信號(hào)中的序號(hào)或名稱。function——與軟中斷信號(hào)關(guān)聯(lián)的函數(shù)名,當(dāng)進(jìn)程在運(yùn)行過程中捕捉到指定的軟中斷信號(hào)后,中斷當(dāng)前程序的執(zhí)行轉(zhuǎn)到該函數(shù)執(zhí)行。注意:軟中斷信號(hào)必須提前預(yù)置,然后才可以在程序運(yùn)行中捕獲。2〕發(fā)送軟中斷信號(hào)函數(shù)intkill(pid,sig)pid——表示一個(gè)或一組進(jìn)程的標(biāo)識(shí)符:當(dāng)pid>0時(shí),將信號(hào)發(fā)送給指定pid的進(jìn)程;當(dāng)pid=0時(shí),將信號(hào)發(fā)送給同組的所有進(jìn)程;當(dāng)pid=-1時(shí),將信號(hào)發(fā)送給以下所有滿足條件的進(jìn)程:該進(jìn)程用戶標(biāo)識(shí)符等于發(fā)送進(jìn)程有效用戶標(biāo)識(shí)符;sig——軟中斷信號(hào)的序號(hào)或名稱功能:向指定進(jìn)程標(biāo)識(shí)符pid的進(jìn)程發(fā)軟中斷信號(hào)sig。本章中用來(lái)實(shí)現(xiàn)父進(jìn)程給子進(jìn)程發(fā)終止執(zhí)行軟中斷信號(hào)。3〕父子父同步的實(shí)現(xiàn)在進(jìn)程同步中,使用exit()和wait()實(shí)現(xiàn)了父進(jìn)程等子進(jìn)程終止的同步,但是這種同步方法不能實(shí)現(xiàn)子進(jìn)程對(duì)父進(jìn)程的等待。要實(shí)現(xiàn)子進(jìn)程對(duì)父進(jìn)程的等待可以使用父進(jìn)程向子進(jìn)程發(fā)軟中斷信號(hào),子進(jìn)程接收信號(hào)的方式實(shí)現(xiàn)。這兩種同步方式相結(jié)合,可以實(shí)現(xiàn)父→子→父的同步序列。實(shí)現(xiàn)父→子→父同步的步驟如下:⑴子進(jìn)程使用signal()預(yù)置軟中斷處理函數(shù),然后等待父進(jìn)程發(fā)軟中斷信號(hào);⑵父進(jìn)程中使用kill()發(fā)軟中斷信號(hào)給子進(jìn)程,再用wait(0)等待子進(jìn)程結(jié)束;⑶子進(jìn)程接收到軟中斷信號(hào)后轉(zhuǎn)去執(zhí)行中斷處理函數(shù)⑷子進(jìn)程在中斷處理返回后,使用exit(0)終止執(zhí)行,向父進(jìn)程發(fā)終止信息。⑸父進(jìn)程使用wait(0)接收到子進(jìn)程的終止信息后結(jié)束等待,并終止自己的程序的執(zhí)行。源代碼:#include<cstdio>#include<cstdlib>#include<unistd.h>#include<iostream>#include<signal.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>usingnamespacestd;boolflag;pid_tp1,p2;voidmy_wait(intq){while(flag);}voidmy_stop(intq){flag=false;}intmain(){signal(SIGINT,my_stop);//DelorCtrl+Ctriggerwhile((p1=fork())==-1);//createchildprogress1if(p1==0){flag=true;//p1setwaitingsignal(SIGUSR1,my_stop);//setSIGUSR1tostopmy_wait(0);//waitinglockf(1,1,0);//lockputs("\nChildProcess1iskilledbyParent!");lockf(1,0,0);//unlocksleep(1);exit(0);}else{while((p2=fork())==-1);//createchildprogress2if(p2==0){flag=true;//p2setwaitingsignal(SIGUSR2,my_stop);//setSIGUSR2tostopmy_wait(0);//waitinglockf(1,1,0);//lockputs("\nChildProcess2iskilledbyParent!");lockf(1,0,0);//unlocksleep(1);exit(0);}else { flag=true;//parentsetwaiting my_wait(0); kill(p1,SIGUSR1); kill(p2,SIGUSR2); wait(NULL); wait(NULL); puts("\nParentProcessiskilled!"); exit(0);}}return0;}4.3.4運(yùn)行結(jié)果:4.3.5分析:如上圖,可見兩個(gè)子進(jìn)程的執(zhí)行順序還是隨機(jī)的。程序3.2:4.3.1題目要求:(b)在上面的程序中增加語(yǔ)句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),觀察執(zhí)行結(jié)果,并分析原因。4.3.2程序設(shè)計(jì)說(shuō)明:signal(SIGTINT,SIG_IGN);//后臺(tái)進(jìn)程讀中斷信號(hào),默認(rèn)掛起signal(SIGQUIT,SIG_IGN);//程序終止信號(hào),默認(rèn)操作寫dump-core文件4.3.3源代碼:(略)4.3.4運(yùn)行結(jié)果及分析:***************************signal(SIGINT,my_wait)加到第二個(gè)else里面***************************加signal(SIGINT,SIG_IGN) **************************加signal(SIGINT,SIGIGN)后signal(SIGINT,my_wait)加到第二個(gè)else里面分析:1〕單純?cè)诔绦?的根底上把signal(SIGINT,my_wait)加到第二個(gè)else里面后一開始子進(jìn)程不再輸出了。這是因?yàn)镾IGINT信號(hào)不只向父進(jìn)程還向子進(jìn)程發(fā)出了信號(hào),而子進(jìn)程并未對(duì)它重定義故就執(zhí)行默認(rèn)定義直接被殺死了。于是子進(jìn)程實(shí)際上是被SIGINT殺死的而不是被父進(jìn)程kill的。2〕單純地加了signal(SIGINT,SIGIGN)后雖然外表看起來(lái)和不加它沒區(qū)別,但是本質(zhì)卻完全不同了?,F(xiàn)在子進(jìn)程確實(shí)是被父進(jìn)程殺死的。因?yàn)镾IGINT已經(jīng)被忽略了。3〕加signal(SIGINT,SIGIGN)并且signal(SIGINT,my_wait)加到第二個(gè)else里面后輸出也是一樣,不會(huì)再發(fā)生子進(jìn)程不輸出的情況了。因?yàn)楝F(xiàn)在子進(jìn)程的SIGINT已經(jīng)被忽略了。*******************************加了signal(SIGQUIT,SIG_IGN) 分析:在程序3的根底上在兩個(gè)進(jìn)程的前面參加signal(SIGQUIT,SIG_IGN),運(yùn)行結(jié)果如上圖輸入ctrl+C時(shí)還是不變但是^\后直接退出了,所有的進(jìn)程都沒有輸出,并沒有被屏蔽。資料說(shuō)signal(SIGTINT,SIG_IGN);//后臺(tái)進(jìn)程讀中斷信號(hào),默認(rèn)掛起signal(SIGQUIT,SIG_IGN);//程序終止信號(hào),默認(rèn)操作寫dump-core文件但是我還是沒有太了解。進(jìn)程的管道通信程序4:題目要求:編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一條管道線,兩個(gè)子進(jìn)程P1和P2分別向管道各寫一句話:Child1issendingamessage!Child2issendingamessage!而父進(jìn)程那么從管道中讀出來(lái)自于兩個(gè)子進(jìn)程的信息,顯示在屏幕上。要求父進(jìn)程先接收子進(jìn)程P1發(fā)來(lái)的消息,然后再接收子進(jìn)程P2發(fā)來(lái)的消息。程序設(shè)計(jì)說(shuō)明:為了防止兩個(gè)進(jìn)程搶占管道,我把第二個(gè)子進(jìn)程延時(shí)了,并且對(duì)管道加鎖,從而形成獨(dú)占,防止沖突產(chǎn)生。而父進(jìn)程只需用之前的wait()函數(shù)即可確保在兩個(gè)子進(jìn)程后執(zhí)行。源代碼:#include<cstdio>#include<cstdlib>#include<unistd.h>#include<iostream>#include<signal.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/wait.h>usingnamespacestd;constintPIPE_MAX=0x7f;//pipebuffermaxsizeconstintRW_MAX=0x40;//r/wbuffermaxsizeintmain(){pid_tp1,p2;intriver[2];//1in,0outcharrb[PIPE_MAX],wb[PIPE_MAX];pipe(river);//createpipewhile((p1=fork())==-1);//createchildprogress1if(p1==0){lockf(river[1],1,0);//locksprintf(wb,"Child1issendingamessage!\n");write(river[1],wb,RW_MAX);lockf(river[1],0,0);//unlockexit(0);}else{while((p2=fork())==-1);//createchildprogress2if(p2==0){sleep(1);//waitp1lockf(river[1],1,0);//locksprintf(wb,"Child2issendingamessage!\n");write(river[1],wb,RW_MAX);lockf(river[1],0,0);//unlockexit(0);}else { wait(NULL);//waitp1 read(river[0],rb,RW_MAX); printf("%s\n",rb); wait(NULL);//waitp2 read(river[0],rb,RW_MAX); printf("%s\n",rb); exit(0); }}return0;}4.4.4運(yùn)行結(jié)果:4.4.5分析: 管道通信通過系統(tǒng)調(diào)用pipe()初始化一個(gè)二元組為管道,1出0進(jìn)。思考1〕系統(tǒng)是怎么創(chuàng)立進(jìn)程的?答:新進(jìn)程通過克隆老進(jìn)程或是當(dāng)前進(jìn)程來(lái)創(chuàng)立。系統(tǒng)調(diào)用fork或clone可以創(chuàng)立新任務(wù),復(fù)制發(fā)生在核心狀態(tài)下地核心中。在類UNIX系統(tǒng)中,除了根進(jìn)程之外,如果想要在系統(tǒng)之中創(chuàng)立一個(gè)新的進(jìn)程,唯一的方法就是利用一個(gè)已存在的進(jìn)程通過系統(tǒng)調(diào)用fork()函數(shù)來(lái)實(shí)現(xiàn),fork()函數(shù)被調(diào)用時(shí),它會(huì)將調(diào)用它的進(jìn)程復(fù)制出一個(gè)副本〔一般會(huì)共享代碼段,其它的數(shù)據(jù)段和堆棧等會(huì)復(fù)制個(gè)新的〕,原進(jìn)程是復(fù)制得到進(jìn)程的父進(jìn)程,兩個(gè)進(jìn)程除了進(jìn)程號(hào)不同,是一模一樣,fork

調(diào)用結(jié)束后將

0

返回給子進(jìn)程,將子進(jìn)程的進(jìn)程號(hào)返回給父進(jìn)程,在調(diào)用fork函數(shù)之后,父子進(jìn)程都將從位于fork函數(shù)的調(diào)用點(diǎn)之后的指令處開始執(zhí)行,因?yàn)槭莾蓚€(gè)不同的進(jìn)程,它們的執(zhí)行是并行的,先后次序是不定的?!矃⒖糒inux內(nèi)核完全解析和編程愛好者網(wǎng)站相關(guān)文章〕2〕可執(zhí)行文件加載時(shí)進(jìn)行了哪些處理?答:當(dāng)操作系統(tǒng)裝載一個(gè)可執(zhí)行文件的時(shí)候,首先操

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論