操作系統(tǒng)上實驗報告3課件_第1頁
操作系統(tǒng)上實驗報告3課件_第2頁
操作系統(tǒng)上實驗報告3課件_第3頁
操作系統(tǒng)上實驗報告3課件_第4頁
操作系統(tǒng)上實驗報告3課件_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統(tǒng)實驗三報告 實驗題目:進程管理及進程通信實驗環(huán)境:虛擬機Linux操作系統(tǒng)實驗目的:1.利用Linux提供的系統(tǒng)調用設計程序,加深對進程概念的理解。2.體會系統(tǒng)進程調度的方法和效果。3.了解進程之間的通信方式以及各種通信方式的使用。 實驗內容:例程1:利用fork()創(chuàng)建子進程#include<stdio.h> #include<stdlib.h>#include<unistd.h> main()int i;if (fork()i=wait(0);/*父進程執(zhí)行的程序段*/* 等待子進程結束*/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);/*子進程執(zhí)行的程序段*/exit(1);/*向父進程發(fā)出結束信號*/運行結果:思考:子進程是如何產生的? 又是如何結束的?子進程被創(chuàng)建后它的運行環(huán)境是怎樣建立的?答:子進程是通過函數(shù)fork()創(chuàng)建的,通過exit()函數(shù)自我結束的,子進程被創(chuàng)建后核心將為其分配一個進程表項和進程標識符,檢查同時運行的進程數(shù)目,并且拷貝

3、進程表項的數(shù)據(jù),由子進程繼承父進程的所有文件。例程2:循環(huán)調用fork()創(chuàng)建多個子進程#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);運行結果:思考:畫出進程的家族樹。子進程的運行環(huán)境是怎樣建立的?反復運行此程序看會有什么情況?解釋一下。答:21440021441214442144621443214422144521447子進程的運行環(huán)境是由將其創(chuàng)建的父進程而建立的,反復運行程序會發(fā)現(xiàn)每個進程標識號在不斷改變,這是因為同一時間有許多進程在被創(chuàng)建。例程3:創(chuàng)建子進程并用execlp()系統(tǒng)調用執(zhí)行程序的實驗#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)建子進程1*/if(child_pid1=0) execlp("echo","echo","child process 1",(char *)0); /*子進程1 啟動其它程序*/perror("exec1 error.n ");exit(1);child_pid2=fork(); /*創(chuàng)建子進程2*/if(child_pid2=0) execlp(&quo

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

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

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

9、進程所以進程標識號不改變,除此之外舊進程的其它信息,代碼段,數(shù)據(jù)段,棧段等均被新程序的信息所代替。新程序從自己的main()函數(shù)開始運行。反復運行此程序發(fā)現(xiàn)結束的先后次序是不可預知的,每次運行結果都不一樣。原因是當每個子進程運行其他程序時,他們的結束隨著其他程序的結束而結束,所以結束的先后次序在改變。例程4:觀察父、子進程對變量處理的影響#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)/*子進程執(zhí)行*/globa+;vari-;printf("Child %d changed the vari and globa.n",getpid();else/*父進程執(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);運行結果:思考:子進程被創(chuàng)建后,對父進程的運行環(huán)境有影響嗎?解釋一下。答:子進程被創(chuàng)建后,對父進程的運行環(huán)境無影響,因為當子進程在運行時,它有自己的代碼段和數(shù)據(jù)段,這些都可以作修改,但是父進程的代碼段和數(shù)據(jù)段是不會隨著子進程數(shù)據(jù)段和代碼段的改變而改變的。例程5:管道通信的實驗#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);/*子進程1 執(zhí)行*/*管道寫入端加鎖*/sprintf(buf,"Child process P1 is sending messages! n");printf("Child process P1! n");write(fd1,buf,50);lockf(fd1,0,0);/*信息寫入管道*/*管道寫入端解鎖*/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)建子進程2*/*子進程2 執(zhí)行*/*管道寫入端加鎖*/sprintf(buf,"Child process P2 is sending messages! n");printf("Child process P2! n");write(fd1,buf,50);lockf(fd1,0,0);/*信息寫入管道*/*管道寫入端解鎖*/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);運行結果:思考:(1)什么是管道?進程如何利用它進行通信的?解釋一下實現(xiàn)方法。 (2)修改睡眠時機、睡眠長度,看看會有什么變化。解釋。 (3)加鎖、解鎖起什么作用?不用它行嗎?答:(1)管道是指能夠連接一個寫進程和一個讀進程、并允許他們以生產者消費者方式進行通信的一個共享文件,又稱pipe文件。由寫進程從管道的入端將數(shù)據(jù)寫入管道,而讀進程則從管道的出端讀出數(shù)據(jù)來進行通信。 (2)修改睡眠時機和睡眠長度都會引起進程被喚醒的時間不一,因為睡眠時機決定進程在何時睡眠,睡眠長度決定進程何時被喚醒。 (3)加鎖、解鎖是為了解決臨

16、界資源的共享問題。不用它將會引起無法有效的管理數(shù)據(jù),即數(shù)據(jù)會被修改導致讀錯了數(shù)據(jù)。例程7:軟中斷信號實驗#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)建子進程*/*父進程執(zhí)行*/*向子進程發(fā)送信號*/printf("Parent: signal 18 has been sent to child %d,returned %d.n",i,j);k=wait();/*父進程被喚醒*/prin

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

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

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

溫馨提示

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

評論

0/150

提交評論