北郵操作系統(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è),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、進(jìn)程管理實(shí)驗(yàn)報(bào)告1實(shí)驗(yàn)?zāi)康模海?)加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別;(2)進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì);(3)分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法;(4)了解Linux系統(tǒng)中進(jìn)程通信的基本原理。2實(shí)驗(yàn)預(yù)備內(nèi)容(1)閱讀Linux的sched.h源碼文件,加深對(duì)進(jìn)程管理概念的理解;(2)閱讀Linux的fork()源碼文件,分析進(jìn)程的創(chuàng)建過程。3、環(huán)境說明本次實(shí)驗(yàn)使用的是win7下的VMWare workstation虛擬機(jī),安裝了ubuntu系統(tǒng) 在ubuntu系統(tǒng)下使用code:blocks IDE編寫代碼并執(zhí)行程序的4、實(shí)驗(yàn)內(nèi)容:1、進(jìn)程的創(chuàng)建:(1)實(shí)驗(yàn)題目和要求:編寫一

2、段程序,使用系統(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é)果,并分析原因。(2)程序設(shè)計(jì)說明:參照書上的例子進(jìn)行設(shè)計(jì),詳見源代碼(3)程序運(yùn)行結(jié)果截圖:(4)程序分析:a,b,c隨機(jī)出現(xiàn),因?yàn)楦高M(jìn)程與兩個(gè)子進(jìn)程之間并沒有同步措施,所以a,b,c隨機(jī)打印出來,也就是三個(gè)進(jìn)程的活動(dòng)次序是隨機(jī)進(jìn)行的,不同的系統(tǒng)可能有不同的進(jìn)程調(diào)度方式。(5)源程序:#include#include#includeint main()pid_t pid1,pi

3、d2;if(pid1=fork()printf("Fork Failed.n");exit(-1);else if(pid1=fork()=0)printf("bn");elseif(pid2=fork()printf("Fork Failed.n");exit(-1);else if(pid2=fork()=0)printf("cn");elsewait(NULL);printf("an");exit(0);return 0;2、進(jìn)程的控制:要求一:(1)實(shí)驗(yàn)題目和要求:修改已經(jīng)編寫的程序,將

4、每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(2)程序設(shè)計(jì)說明:將第一個(gè)程序的輸出進(jìn)行修改,把輸出一個(gè)字符改為一句話,其他不變(3)程序運(yùn)行結(jié)果截圖:(4)程序分析:和第一個(gè)程序的輸出順序,也就是三個(gè)進(jìn)程活動(dòng)的次序基本是一致的,同一個(gè)進(jìn)程里輸出的字符串不會(huì)被中斷(5)源程序:#include#include#includeint main()pid_t pid1,pid2;if(pid1=fork()printf("Fork Failed.n");exit(-1);else if(pid1=fork()=0)printf(&qu

5、ot;Child process 1 is created!n");elseif(pid2=fork()printf("Fork Failed.n");exit(-1);else if(pid2=fork()=0)printf("Child process 2 is created!n");elsewait(NULL);printf("The parent process is created!n");exit(0);return 0;要求二:(1)實(shí)驗(yàn)題目和要求:如果在程序中使用系統(tǒng)調(diào)用lockf () 來給每一個(gè)進(jìn)程加鎖

6、,可以實(shí)現(xiàn)進(jìn)程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。(2)程序設(shè)計(jì)說明:在每個(gè)進(jìn)程的每個(gè)條件語(yǔ)句中開頭加入lockf(1,1,0),結(jié)尾處加入lockf(1,0,0),從而實(shí)現(xiàn)給每一個(gè)進(jìn)程加鎖并且實(shí)現(xiàn)進(jìn)程之間的互斥(3)程序運(yùn)行結(jié)果截圖:(4)程序分析:根據(jù)輸出情況可以看出,每個(gè)進(jìn)程活動(dòng)的次序都是隨機(jī)的,但是加鎖后進(jìn)程執(zhí)行完畢后才會(huì)讓另一個(gè)進(jìn)程執(zhí)行而不會(huì)中途被打斷,因此lockf(1,1,0)的作用是鎖定屏幕輸出,不讓其他進(jìn)程可以輸出到屏幕,lockf(1,0,0)則是解鎖(5)源程序:#include#include#includeint main()pid_t pid1,pid2;inti;i

7、f(pid1=fork()printf("Fork Failed.n");exit(-1);else if(pid1=fork()=0)lockf(1,1,0);for(i=0;i<=2;i+)printf("process A:%dn",i);lockf(1,0,0);elseif(pid2=fork()printf("Fork Failed.n");exit(-1);else if(pid2=fork()=0)lockf(1,1,0);for(i=0;i<=2;i+)printf("process B:%dn

8、",i);lockf(1,0,0);elselockf(1,1,0);for(i=0;i<=2;i+)printf("process C:%dn",i);lockf(1,0,0);exit(0);return 0;3、進(jìn)程的軟中斷通信:(1)實(shí)驗(yàn)題目和要求:編寫一段程序,使其實(shí)現(xiàn)進(jìn)程的軟中斷通信。(a)要求:使用系統(tǒng)調(diào)用fork() 創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal() 讓父進(jìn)程捕捉鍵盤上來的中斷信號(hào)(即按DEL鍵);當(dāng)捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用Kill() 向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出下列信息后終止:Child Proc

9、ess 1 is killed by Parent!Child Process 2 is killed by Parent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下的信息后終止:Parent Process is killed!源程序:#include#include#include#include#includeint live;void live_wait()while(live = 1);void be_killed()live = 0;int main()pid_t p1,p2;while(p1=fork() = -1);if(p1 = 0)live = 1;signal(1,be_kil

10、led);live_wait(); printf("Child Process 1 is killed by Parent!n"); exit(0);if(p2 = 0) live = 1; else while(p2=fork() = -1);signal(2,be_killed);signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); live_wait(); printf("Child Process 2 is killed by Parent!n"); exit(0); live = 1;live_wai

11、t(); kill(p1,1); kill(p2,2); wait(NULL); wait(NULL); printf("Parent Process is killed!n"); exit(0);return 0;(b)在上面的程序中增加語(yǔ)句signal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN),觀察執(zhí)行結(jié)果,并分析原因。(2)程序設(shè)計(jì)說明:signal(SIGTINT, SIG_IGN)從后臺(tái)進(jìn)程讀中斷信號(hào),signal(SIGQUIT, SIG_IGN)程序終止信號(hào)(3)程序運(yùn)行結(jié)果截圖:(4)程序分析:用系統(tǒng)調(diào)用sign

12、al() 讓父進(jìn)程捕捉鍵盤上來的中斷信號(hào)ctrl+c(a)沒有添加signal(SIGINT,SIG_IGN)時(shí)可以看出程序運(yùn)行在子進(jìn)程1中,當(dāng)按下ctrl+c后子進(jìn)程1被直接殺死,而不是由父進(jìn)程的kill殺死,沒有打印語(yǔ)句Child Process 1 is killed by Parent!。但是子進(jìn)程2是被父進(jìn)程殺死故打印語(yǔ)句:Child Process 2 is killed by Parent!。(b)在兩個(gè)子進(jìn)程中添加了signal(SIGINT,SIG_IGN),這樣使得兩個(gè)子進(jìn)程不被ctrl+c殺死而由父進(jìn)程殺死。所以從實(shí)驗(yàn)截圖中可以看出,兩個(gè)子進(jìn)程均被父進(jìn)程殺死故打印語(yǔ)句Ch

13、ild Process 1 is killed by Parent!和Child Process 2 is killed by Parent!(5)源程序:#include#includeintwait_mark;void waiting()while(wait_mark=1);void stop()wait_mark=0;int main()int p1,p2;while(p1=fork()=-1);if(p1=0)wait_mark=1;signal(SIGINT,SIG_IGN);signal(16,stop);waiting();printf("Child Process1

14、is Killed by Parent!n");exit(0);elsewhile(p2=fork()=-1);if(p2=0)wait_mark=1;signal(SIGINT,SIG_IGN);signal(17,stop);waiting();printf("Child Process2 is Killed by Parent!n");exit(0);elsewait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);kill(p2,17);wait(0);wait(0);printf("Parent

15、 Process is Killed!n");exit(0);4、進(jìn)程的管道通信:(1) 實(shí)驗(yàn)題目和要求:編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe() 建立一條管道線;兩個(gè)子進(jìn)程P1和P2分別向管道各寫一句話:Child 1 is sending a message!Child 2 is sending a message!而父進(jìn)程則從管道中讀出來自于兩個(gè)子進(jìn)程的信息,顯示在屏幕上。要求父進(jìn)程先接收子進(jìn)程P1發(fā)來的消息,然后再接收子進(jìn)程P2發(fā)來的消息。(2) 程序設(shè)計(jì)說明:使用系統(tǒng)調(diào)用pipe()建立一條管道線,并且對(duì)管道加鎖,從而形成獨(dú)占,避免沖突產(chǎn)生。而父進(jìn)程用之前

16、的wait()函數(shù)等待兩個(gè)子進(jìn)程執(zhí)行后再執(zhí)行。(3) 程序運(yùn)行結(jié)果截圖:(4) 程序分析:管道通信通過系統(tǒng)調(diào)用pipe()初始化一個(gè)二元組為管道,1出0進(jìn)。(5) 源程序:#include #include #include int pid1,pid2;int main()intfd2;char OutPipe100, InPipe100;pipe(fd);while(pid1 = fork() = -1);if( pid1 = 0)lockf( fd1, 1, 0 );sprintf(OutPipe, "n Child process 1 is sending message!n&

17、quot;);write( fd1, OutPipe, 50);sleep(5);lockf(fd1, 0 , 0);exit(0);elsewhile(pid2 = fork() = -1);if( pid2 = 0)lockf( fd1, 1, 0 );sprintf(OutPipe, "n Child process 2 is sending message!n");write( fd1, OutPipe, 50);sleep(3);lockf(fd1, 0 , 0);exit(0);elsewait(0);read(fd0, InPipe, 50);printf(&

18、quot;%sn", InPipe);wait(0);read(fd0, InPipe, 50);printf("%sn", InPipe);exit(0);return 0;4思考(部分參考網(wǎng)上資料)(1)系統(tǒng)是怎樣創(chuàng)建流程的?linux 系統(tǒng)創(chuàng)建進(jìn)程是用 fork() 系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程由 fork() 系統(tǒng)調(diào)用創(chuàng)建的新進(jìn)程被稱為子進(jìn)程。該函數(shù)被調(diào)用一次,但返回兩次。如果 fork()進(jìn)程調(diào)用成功,兩次返回的區(qū)別是子進(jìn)程的返回值是0,而父進(jìn)程的返回值則是新子進(jìn)程的進(jìn)程號(hào)(2)可執(zhí)行文件加載時(shí)進(jìn)行了哪些處理?相對(duì)可執(zhí)行文件有三個(gè)重要的概念:編譯(compile)

19、、連接(link,也可稱為鏈接、聯(lián)接)、加載(load)。源程序文件被編譯成目標(biāo)文件,多個(gè)目標(biāo)文件被連接成一個(gè)最終的可執(zhí)行文件,可執(zhí)行文件被加載到內(nèi)存中運(yùn)行。當(dāng)操作系統(tǒng)裝載一個(gè)可執(zhí)行文件的時(shí)候,首先操作系統(tǒng)判斷該文件是否是一個(gè)合法的可執(zhí)行文件。如果是操作系統(tǒng)將按照段表中的指示為可執(zhí)行程序分配地址空間。(3)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里?fork系統(tǒng)調(diào)用創(chuàng)建的子進(jìn)程繼承了原進(jìn)程的context,也就是說fork調(diào)用成功后,子進(jìn)程與父進(jìn)程并發(fā)執(zhí)行相同的代碼。但由于子進(jìn)程也繼承了父進(jìn)程的程序指針,所以子進(jìn)程是從fork()后的語(yǔ)句開始執(zhí)行(也就是新進(jìn)程調(diào)用的入口)。另外fork在子進(jìn)程和父進(jìn)程中的返回值是不同的。在父進(jìn)程中返回子進(jìn)程的PID,而在子進(jìn)程中返回0。所以可以在程序中檢查PID的值,使父進(jìn)程和子進(jìn)程執(zhí)行不同的分支。(4)進(jìn)程通信有什么特點(diǎn)?管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信;信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論