操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3課件_第1頁(yè)
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3課件_第2頁(yè)
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3課件_第3頁(yè)
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3課件_第4頁(yè)
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3課件_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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、操作系統(tǒng)實(shí)驗(yàn)三報(bào)告 實(shí)驗(yàn)題目:進(jìn)程管理及進(jìn)程通信實(shí)驗(yàn)環(huán)境:虛擬機(jī)Linux操作系統(tǒng)實(shí)驗(yàn)?zāi)康模?.利用Linux提供的系統(tǒng)調(diào)用設(shè)計(jì)程序,加深對(duì)進(jìn)程概念的理解。2.體會(huì)系統(tǒng)進(jìn)程調(diào)度的方法和效果。3.了解進(jìn)程之間的通信方式以及各種通信方式的使用。 實(shí)驗(yàn)內(nèi)容:例程1:利用fork()創(chuàng)建子進(jìn)程#include<stdio.h> #include<stdlib.h>#include<unistd.h> main()int i;if (fork()i=wait(0);/*父進(jìn)程執(zhí)行的程序段*/* 等待子進(jìn)程結(jié)束*/printf("It is parent pr

2、ocess.n");printf("The child process,ID number %d, is finished.n",i);elseprintf("It is child process.n");sleep(10);/*子進(jìn)程執(zhí)行的程序段*/exit(1);/*向父進(jìn)程發(fā)出結(jié)束信號(hào)*/運(yùn)行結(jié)果:思考:子進(jìn)程是如何產(chǎn)生的? 又是如何結(jié)束的?子進(jìn)程被創(chuàng)建后它的運(yùn)行環(huán)境是怎樣建立的?答:子進(jìn)程是通過(guò)函數(shù)fork()創(chuàng)建的,通過(guò)exit()函數(shù)自我結(jié)束的,子進(jìn)程被創(chuàng)建后核心將為其分配一個(gè)進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識(shí)符,檢查同時(shí)運(yùn)行的進(jìn)程數(shù)目,并且拷貝

3、進(jìn)程表項(xiàng)的數(shù)據(jù),由子進(jìn)程繼承父進(jìn)程的所有文件。例程2:循環(huán)調(diào)用fork()創(chuàng)建多個(gè)子進(jìn)程#include<stdio.h> #include<stdlib.h>#include<unistd.h>main() int i,j;printf(“My pid is %d, my fathers pid is %dn”,getpid(),getppid();for(i=0; i<3; i+)if(fork()=0)printf(“%d pid=%d ppid=%dn”, i,getpid(),getppid();else j=wait(0);Printf(“

4、 %d:The chile %d is finished.n” ,getpid(),j);運(yùn)行結(jié)果:思考:畫(huà)出進(jìn)程的家族樹(shù)。子進(jìn)程的運(yùn)行環(huán)境是怎樣建立的?反復(fù)運(yùn)行此程序看會(huì)有什么情況?解釋一下。答:21440021441214442144621443214422144521447子進(jìn)程的運(yùn)行環(huán)境是由將其創(chuàng)建的父進(jìn)程而建立的,反復(fù)運(yùn)行程序會(huì)發(fā)現(xiàn)每個(gè)進(jìn)程標(biāo)識(shí)號(hào)在不斷改變,這是因?yàn)橥粫r(shí)間有許多進(jìn)程在被創(chuàng)建。例程3:創(chuàng)建子進(jìn)程并用execlp()系統(tǒng)調(diào)用執(zhí)行程序的實(shí)驗(yàn)#include<stdio.h>#include<unistd.h>main()int child_pid1

5、,child_pid2,child_pid3;int pid,status;setbuf(stdout,NULL);child_pid1=fork(); /*創(chuàng)建子進(jìn)程1*/if(child_pid1=0) execlp("echo","echo","child process 1",(char *)0); /*子進(jìn)程1 啟動(dòng)其它程序*/perror("exec1 error.n ");exit(1);child_pid2=fork(); /*創(chuàng)建子進(jìn)程2*/if(child_pid2=0) execlp(&quo

6、t;date","date",(char *)0); /*子進(jìn)程2 啟動(dòng)其它程序*/perror("exec2 error.n ");exit(2);child_pid3=fork(); /*創(chuàng)建子進(jìn)程3*/if(child_pid3=0) execlp("ls","ls",(char *)0); /*子進(jìn)程3 啟動(dòng)其它程序*/perror("exec3 error.n ");exit(3);puts("Parent process is waiting for chile

7、process return!");while(pid=wait(&status)!=-1) /*等待子進(jìn)程結(jié)束*/ if(child_pid1=pid) /*若子進(jìn)程1 結(jié)束*/printf("child process 1 terminated with status %dn",(status>>8);elseif(child_pid2=pid) /*若子進(jìn)程2 結(jié)束*/printf("child process 2 terminated with status %dn",(status>>8);else i

8、f(child_pid3=pid) /*若子進(jìn)程3 結(jié)束*/printf("child process 3 terminated with status %dn" ,(status>>8);puts("All child processes terminated.");puts("Parent process terminated.");exit(0);運(yùn)行結(jié)果:思考:子進(jìn)程運(yùn)行其他程序后,進(jìn)程運(yùn)行環(huán)境怎樣變化的?反復(fù)運(yùn)行此程序看會(huì)有什么情況?解釋一下。答:子進(jìn)程運(yùn)行其他程序后,這個(gè)進(jìn)程就完全被新程序代替。由于并沒(méi)有產(chǎn)生新

9、進(jìn)程所以進(jìn)程標(biāo)識(shí)號(hào)不改變,除此之外舊進(jìn)程的其它信息,代碼段,數(shù)據(jù)段,棧段等均被新程序的信息所代替。新程序從自己的main()函數(shù)開(kāi)始運(yùn)行。反復(fù)運(yùn)行此程序發(fā)現(xiàn)結(jié)束的先后次序是不可預(yù)知的,每次運(yùn)行結(jié)果都不一樣。原因是當(dāng)每個(gè)子進(jìn)程運(yùn)行其他程序時(shí),他們的結(jié)束隨著其他程序的結(jié)束而結(jié)束,所以結(jié)束的先后次序在改變。例程4:觀察父、子進(jìn)程對(duì)變量處理的影響#include<stdio.h>#include<sys/types.h>#include<unistd.h>int globa=4;int main()pid_t pid;int vari=5;printf("

10、before fork.n");if (pid=fork()<0)printf("fork error.n");exit(0);elseif(pid=0)/*子進(jìn)程執(zhí)行*/globa+;vari-;printf("Child %d changed the vari and globa.n",getpid();else/*父進(jìn)程執(zhí)行*/wait(0);printf("Parent %d did not changed the vari and globa.n",getpid();printf("pid=%d,

11、globa=%d, vari=%dn",getpid(),globa,vari);/*都執(zhí)行*/exit(0);運(yùn)行結(jié)果:思考:子進(jìn)程被創(chuàng)建后,對(duì)父進(jìn)程的運(yùn)行環(huán)境有影響嗎?解釋一下。答:子進(jìn)程被創(chuàng)建后,對(duì)父進(jìn)程的運(yùn)行環(huán)境無(wú)影響,因?yàn)楫?dāng)子進(jìn)程在運(yùn)行時(shí),它有自己的代碼段和數(shù)據(jù)段,這些都可以作修改,但是父進(jìn)程的代碼段和數(shù)據(jù)段是不會(huì)隨著子進(jìn)程數(shù)據(jù)段和代碼段的改變而改變的。例程5:管道通信的實(shí)驗(yàn)#include<stdlib.h>#include<stdio.h>main()int i,r,j,k,l,p1,p2,fd2;char buf50,s50;pipe(fd);

12、while(p1=fork()=-1);if(p1=0)lockf(fd1,1,0);/*子進(jìn)程1 執(zhí)行*/*管道寫(xiě)入端加鎖*/sprintf(buf,"Child process P1 is sending messages! n");printf("Child process P1! n");write(fd1,buf,50);lockf(fd1,0,0);/*信息寫(xiě)入管道*/*管道寫(xiě)入端解鎖*/sleep(5);j=getpid();k=getppid();printf("P1 %d is weakup. My parent proces

13、s ID is %d.n",j,k);exit(0);else while(p2=fork()=-1);if(p2=0)lockf(fd1,1,0);/*創(chuàng)建子進(jìn)程2*/*子進(jìn)程2 執(zhí)行*/*管道寫(xiě)入端加鎖*/sprintf(buf,"Child process P2 is sending messages! n");printf("Child process P2! n");write(fd1,buf,50);lockf(fd1,0,0);/*信息寫(xiě)入管道*/*管道寫(xiě)入端解鎖*/sleep(5);j=getpid();k=getppid();

14、printf("P2 %d is weakup. My parent process ID is %d.n",j,k);exit(0);else l=getpid();wait(0);if(r=read(fd0,s,50)=-1)printf("Can't read pipe. n");elseprintf("Parent %d: %s n",l,s);wait(0);if(r=read(fd0,s,50)=-1)printf("Can't read pipe. n");elseprintf(&qu

15、ot;Parent %d: %s n",l,s);exit(0);運(yùn)行結(jié)果:思考:(1)什么是管道?進(jìn)程如何利用它進(jìn)行通信的?解釋一下實(shí)現(xiàn)方法。 (2)修改睡眠時(shí)機(jī)、睡眠長(zhǎng)度,看看會(huì)有什么變化。解釋。 (3)加鎖、解鎖起什么作用?不用它行嗎?答:(1)管道是指能夠連接一個(gè)寫(xiě)進(jìn)程和一個(gè)讀進(jìn)程、并允許他們以生產(chǎn)者消費(fèi)者方式進(jìn)行通信的一個(gè)共享文件,又稱(chēng)pipe文件。由寫(xiě)進(jìn)程從管道的入端將數(shù)據(jù)寫(xiě)入管道,而讀進(jìn)程則從管道的出端讀出數(shù)據(jù)來(lái)進(jìn)行通信。 (2)修改睡眠時(shí)機(jī)和睡眠長(zhǎng)度都會(huì)引起進(jìn)程被喚醒的時(shí)間不一,因?yàn)樗邥r(shí)機(jī)決定進(jìn)程在何時(shí)睡眠,睡眠長(zhǎng)度決定進(jìn)程何時(shí)被喚醒。 (3)加鎖、解鎖是為了解決臨

16、界資源的共享問(wèn)題。不用它將會(huì)引起無(wú)法有效的管理數(shù)據(jù),即數(shù)據(jù)會(huì)被修改導(dǎo)致讀錯(cuò)了數(shù)據(jù)。例程7:軟中斷信號(hào)實(shí)驗(yàn)#include<stdlib.h>#include<stdio.h>main()int i,j,k;int func();signal(18,func();if(i=fork()j=kill(i,18);/*創(chuàng)建子進(jìn)程*/*父進(jìn)程執(zhí)行*/*向子進(jìn)程發(fā)送信號(hào)*/printf("Parent: signal 18 has been sent to child %d,returned %d.n",i,j);k=wait();/*父進(jìn)程被喚醒*/prin

17、tf("After wait %d,Parent %d: finished.n",k,getpid();else/*子進(jìn)程執(zhí)行*/sleep(10);printf("Child %d: A signal from my parent is recived.n",getpid(); /*子進(jìn)程結(jié)束,向父進(jìn)程發(fā)子進(jìn)程結(jié)束信號(hào)*/func()/*處理程序*/ int m;m=getpid();printf("I am Process %d: It is signal 18 processing function.n",m);運(yùn)行結(jié)果:思考:

18、討論一下它與硬中斷有什么區(qū)別?答:硬中斷是由外部硬件產(chǎn)生的,而軟中斷是CPU根據(jù)軟件的某條指令或者軟件對(duì)標(biāo)志寄存器的某個(gè)標(biāo)志位的設(shè)置而產(chǎn)生的。研究:什么是進(jìn)程?如何產(chǎn)生的? 答:進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。一旦操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建新進(jìn)程的事件后,便調(diào)用進(jìn)程創(chuàng)建原語(yǔ)Creat()按下述步驟創(chuàng)建一個(gè)新進(jìn)程:(1)申請(qǐng)空白PCB。為新進(jìn)程申請(qǐng)獲得惟一的數(shù)字標(biāo)識(shí)符,并從PCB集合中索取一個(gè)空白PCB。(2)為新進(jìn)程分配資源。為新進(jìn)程的程序和數(shù)據(jù)以及用戶棧分配必要的內(nèi)存空間。顯然此時(shí)操作系統(tǒng)必須知道新進(jìn)程所需內(nèi)存的大小。對(duì)于批處理作業(yè),其大小可在用戶提出創(chuàng)建進(jìn)程要

19、求時(shí)提供。若是為應(yīng)用進(jìn)程創(chuàng)建子進(jìn)程,也應(yīng)是在該進(jìn)程提出創(chuàng)建進(jìn)程的請(qǐng)求中給出所需內(nèi)存的大小。對(duì)于交互型作業(yè),用戶可以不給出內(nèi)存要求而由系統(tǒng)分配一定的空間。如果新進(jìn)程要共享某個(gè)已在內(nèi)在的地址空間(即已裝入內(nèi)存的共享段),則必須建立相應(yīng)的鏈接。(3)初始化進(jìn)程控件塊。PCB的初始化包括:1.初始化標(biāo)識(shí)信息,將系統(tǒng)分配的標(biāo)識(shí)符和父進(jìn)程標(biāo)識(shí)符填入新PCB中;2.初始化處理機(jī)狀態(tài)信息,使程序計(jì)數(shù)器指向程序的入口地址,使棧指針指向棧頂;3.初始化處理機(jī)控制信息,將進(jìn)程的狀態(tài)設(shè)置為就緒狀態(tài)或靜止就緒狀態(tài),對(duì)于優(yōu)先級(jí),通常是將它設(shè)置為最低優(yōu)先級(jí),除非用戶以顯式方式提出高優(yōu)先級(jí)要求。(4)將新進(jìn)程插入就緒隊(duì)列,如果進(jìn)程就緒隊(duì)列能夠接納新進(jìn)程,便將新進(jìn)程插入就緒

溫馨提示

  • 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)論