操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理、進(jìn)程間通信_(tái)第1頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理、進(jìn)程間通信_(tái)第2頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理、進(jìn)程間通信_(tái)第3頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理、進(jìn)程間通信_(tái)第4頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理、進(jìn)程間通信_(tái)第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、煙臺(tái)大學(xué)文經(jīng)學(xué)院煙 臺(tái) 大 學(xué) 文 經(jīng) 學(xué) 院 課程:操作系統(tǒng) 學(xué) 號(hào): 姓 名: 班 級(jí): 指導(dǎo)老師: 設(shè)計(jì)名稱進(jìn)程管理。進(jìn)程間通信。成 員課程設(shè)計(jì)地點(diǎn)一 課程設(shè)計(jì)思想及目的(1)加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。 (2)進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。 (3)分析進(jìn)程競(jìng)爭(zhēng)資源現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法。 (4)了解Linux系統(tǒng)中進(jìn)程通信的基本原理。Linux系統(tǒng)的進(jìn)程通信機(jī)構(gòu) (IPC) 允許在任意進(jìn)程間大批量地交換數(shù)據(jù)。本實(shí)驗(yàn)的目的是了解和熟悉Linux支持的消息通訊機(jī)制及信息量機(jī)制。二 課程設(shè)計(jì)設(shè)備及環(huán)境裝有Linux操作系統(tǒng)的PC機(jī)三 課程設(shè)計(jì)內(nèi)容(1)進(jìn)程的創(chuàng)建 編寫一段源

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”。試觀察紀(jì)錄屏幕上的顯示結(jié)果,并分析原因。 (2)進(jìn)程的控制 修改已編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,在觀察程序執(zhí)行時(shí)屏幕出現(xiàn)的現(xiàn)象,并分析原因。 如果在程序中使用調(diào)用lockf()來給每一個(gè)子進(jìn)程加鎖,可以實(shí)現(xiàn)進(jìn)程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。 (3)編寫一段程序,使其現(xiàn)實(shí)進(jìn)程的軟中斷通信。消息的創(chuàng)建,發(fā)送和接收。 使用系統(tǒng)調(diào)用msgget (), msgsnd (), msg

3、rev (), 及msgctl () 編制一長度為1k的消息的發(fā)送和接收程序。 觀察上面的程序,說明控制消息隊(duì)列系統(tǒng)調(diào)用msgctl () 在此起什么作用?共享存儲(chǔ)區(qū)的創(chuàng)建、附接和段接。 使用系統(tǒng)調(diào)用shmget(),shmat(),sgmdt(),shmctl(),編制一個(gè)與上述功能相同的程序。比較上述(1),(2)兩種消息通信機(jī)制中數(shù)據(jù)傳輸?shù)臅r(shí)間。 四 . 課程設(shè)計(jì)過程及結(jié)果1 進(jìn)程的創(chuàng)建任務(wù)編寫一段程序,使用系統(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”。

4、試觀察記錄屏幕上的顯示結(jié)果,并分析原因。程序#includemain()int p1,p2;if(p1=fork() /*子進(jìn)程創(chuàng)建成功*/ putchar(b);else if(p2=fork() /*子進(jìn)程創(chuàng)建成功*/ putchar(c); else putchar(a); /*父進(jìn)程執(zhí)行*/bca(有時(shí)會(huì)出現(xiàn)abc的任意的排列)分析:從進(jìn)程執(zhí)行并發(fā)來看,輸出abc的排列都是有可能的。原因:fork()創(chuàng)建進(jìn)程所需的時(shí)間雖然可能多于輸出一個(gè)字符的時(shí)間,但各個(gè)進(jìn)程的時(shí)間片的獲得卻不是一定是順序的,所以輸出abc的排列都是有可能的。2 進(jìn)程的控制 修改已編寫好的程序,將每個(gè)程序的輸出由單個(gè)字

5、符改為一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析其原因。如果在程序中使用系統(tǒng)調(diào)用lockf()來給每個(gè)程序加鎖,可以實(shí)現(xiàn)進(jìn)程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。程序1#includemain()int p1,p2,i;if(p1=fork() for(i=0;i500;i+) printf(parent%dn,i); wait(0); /* 保證在子進(jìn)程終止前,父進(jìn)程不會(huì)終止*/exit(0);else if(p2=fork() for(i=0;i500;i+) printf(son %dn,i); wait(0); /* 保證在子進(jìn)程終止前,父進(jìn)程不會(huì)終止*/ exit(0); /*向父

6、進(jìn)程信號(hào)0且該進(jìn)程推出*/ else for(i=0;i500;i+) printf(“grandchild %dn,i); exit(0);運(yùn)行結(jié)果parent.songrandchildgrandchild或grandchildsongrandchildsonparent分析:由于函數(shù)printf()輸出的字符串之間不會(huì)被中斷,因此,每個(gè)字符串內(nèi)部的字符順序輸出時(shí)不變。但是 , 由于進(jìn)程并發(fā)執(zhí)行時(shí)的調(diào)度順序和父子進(jìn)程的搶占處理機(jī)問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。程序2#includemain()int p1,p2,i;if(p1=fork()

7、lockf(1,1,0); for(i=0;i500;i+) printf(parent %dn,i); lockf(1,0,0); wait(0); /* 保證在子進(jìn)程終止前,父進(jìn)程不會(huì)終止*/ exit(0);else if(p2=fork() lockf(1,1,0); for(i=0;i500;i+) printf(son %dn,i); lockf(1,0,0); wait(0); /* 保證在子進(jìn)程終止前,父進(jìn)程不會(huì)終止*/exit(0); else lockf(1,1,0); for(i=0;i500;i+) printf(daughter %dn,i); lockf(1,0,0

8、); exit(0); 運(yùn)行結(jié)果輸出parent塊,son塊,grandchild塊的順序可能不同,但是每個(gè)塊的輸出過程不會(huì)被打斷。分析:因?yàn)樯鲜龀绦驁?zhí)行時(shí),lockf(1,1,0)鎖定標(biāo)準(zhǔn)輸出設(shè)備,lockf(1,0,0)解鎖標(biāo)準(zhǔn)輸出設(shè)備,在lockf(1,1,0)與lockf(1,0,0)中間的for循環(huán)輸出不會(huì)被中斷,加鎖與不加鎖效果不相同。3軟中斷通信任務(wù)1編制一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中斷信號(hào)(即按ctrl+c鍵),當(dāng)捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后,分別輸

9、出下列信息后終止:child process1 is killed by parent!child process2 is killed by parent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出以下信息后終止:parent process is killed! #include#include#include void waiting(),stop(),alarming();int wait_mark;main()int p1,p2;if(p1=fork() /*創(chuàng)建子進(jìn)程p1*/if(p2=fork() /*創(chuàng)建子進(jìn)程p2*/wait_mark=1;signal(SIGINT,stop); /*

10、接收到c信號(hào),轉(zhuǎn)stop*/signal(SIGALRM,alarming);/*接受SIGALRMwaiting();kill(p1,16); /*向p1發(fā)軟中斷信號(hào)16*/ kill(p2,17); /*向p2發(fā)軟中斷信號(hào)17*/ wait(0); /*同步*/wait(0);printf(parent process is killed!n);exit(0); else wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN); /*忽略 c信號(hào)*/while (wait_mark!=0);lockf(1,1,0);printf(child p

11、rocess2 is killed by parent!n);lockf(1,0,0);exit(0);elsewait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN); /*忽略c信號(hào)*/while (wait_mark!=0)lockf(1,1,0);printf(child process1 is killed by parent!n);lockf(1,0,0);exit(0);void waiting()sleep(5);if (wait_mark!=0) kill(getpid(),SIGALRM);void alarming()wait_

12、mark=0;void stop()wait_mark=0; 不做任何操作等待五秒鐘父進(jìn)程回在子進(jìn)程縣推出后退出,并打印退出的順序;或者點(diǎn)擊ctrl+C后程序退出并打印退出的順序。任務(wù)2在上面的任務(wù)1中,增加語句signal(SIGINT,SIG_IGN)和語句signal(SIGQUIT,SIG_IGN),觀察執(zhí)行結(jié)果,并分析原因。這里,signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分別為忽略鍵信號(hào)以及忽略中斷信號(hào)。#include#include#includeint pid1,pid2;int EndFlag=0;int pf1=0;int

13、pf2=0;void IntDelete()kill(pid1,16);kill(pid2,17);void Int1()printf(child process 1 is killed !by parentn);exit(0);void Int2()printf(child process 2 is killed !by parentn);exit(0);main()int exitpid;if(pid1=fork() if(pid2=fork() signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);p

14、rintf(parent process is killedn);exit(0); else signal(SIGINT,SIG_IGN);signal(17,Int2);pause(); elsesignal(SIGINT,SIG_IGN);signal(16,Int1);pause();運(yùn)行結(jié)果請(qǐng)讀者將上述程序輸入計(jì)算機(jī)后,執(zhí)行并觀察。3 進(jìn)程的管道通信任務(wù) 編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一條管道線。兩個(gè)子進(jìn)程p1和p2分別向通道個(gè)寫一句話: child1 process is sending message!child2 process is sendin

15、g message!而父進(jìn)程則從管道中讀出來自兩個(gè)進(jìn)程的信息,顯示在屏幕上。程序#include #include #include int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個(gè)管道*/while (pid1=fork( )=-1);if(pid1=0) lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入數(shù)組outpipe中*/ write(fd1,outpipe,50); /*向管道寫長為5

16、0字節(jié)的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); /*同步*/ read(fd0,inpipe,50); /*從管道中讀長為50字節(jié)的串*/ printf(%sn,

17、inpipe); wait(0); read(fd0,inpipe,50); printf(%sn,inpipe); exit(0); 運(yùn)行結(jié)果延遲5秒后顯示:child1 process is sending message! 再延遲5秒:child2 process is sending message!(2)進(jìn)程的管道通信 編制一段程序,實(shí)現(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一條管道線。兩個(gè)子進(jìn)程p1和p2分別向通道個(gè)寫一句話: child1 process is sending message!child2 process is sending message!而父進(jìn)程則從管

18、道中讀出來自兩個(gè)進(jìn)程的信息,顯示在屏幕上。#include #include #include int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個(gè)管道*/while (pid1=fork( )=-1);if(pid1=0) lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入數(shù)組outpipe中*/ write(fd1,outpipe,50); /*向管道寫長為50字節(jié)的串*/ sleep(5); /

19、*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); /*同步*/ read(fd0,inpipe,50); /*從管道中讀長為50字節(jié)的串*/ printf(%sn,inpipe); wait(0); r

20、ead(fd0,inpipe,50); printf(%sn,inpipe); exit(0); 運(yùn)行結(jié)果延遲5秒后顯示:child1 process is sending message! 再延遲5秒:child2 process is sending message!(2)消息的創(chuàng)建,發(fā)送和接收#include #include #include #include #define MSGKEY 75 /*定義關(guān)鍵詞MEGKEY*/Struct msgform /*消息結(jié)構(gòu)*/long mtype;char mtexe100; /*文本長度*/msg;int msgqid,i;void CLIENT( )int i;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i=1;i-) msg.mtype=i; printf(client)sent

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論