操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3_第1頁
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3_第2頁
操作系統(tǒng)上實(shí)驗(yàn)報(bào)告3_第3頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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)康?:1. 利用 Linux 提供的系統(tǒng)調(diào)用設(shè)計(jì)程序, 加深對進(jìn)程概念的理解。2. 體會系統(tǒng)進(jìn)程調(diào)度的方法和效果。3. 了解進(jìn)程之間的通信方式以及各種通信方式的使用。實(shí)驗(yàn)內(nèi)容 :例程 1:利用 fork() 創(chuàng)建子進(jìn)程#include#include#includemain()int i;if (fork()i=wait(0);/* 父進(jìn)程執(zhí)行的程序段*/*等待子進(jìn)程結(jié)束*/printf(It is parent process.n);printf(The child process,ID numbe

2、r %d, is finished.n,i);elseprintf(It is child process.n);sleep(10);/* 子進(jìn)程執(zhí)行的程序段*/exit(1);/* 向父進(jìn)程發(fā)出結(jié)束信號*/運(yùn)行結(jié)果:思考:子進(jìn)程是如何產(chǎn)生的? 又是如何結(jié)束的?子進(jìn)程被創(chuàng)建后它的運(yùn)行環(huán)境是怎樣建立的?答:子進(jìn)程是通過函數(shù)fork()創(chuàng)建的,通過exit()函數(shù)自我結(jié)束的,子進(jìn)程被創(chuàng)建后核心將為其分配一個進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識符, 檢查同時運(yùn)行的進(jìn)程數(shù)目, 并且拷貝進(jìn)程表項(xiàng)的數(shù)據(jù),由子進(jìn)程繼承父進(jìn)程的所有文件。例程 2:循環(huán)調(diào)用fork() 創(chuàng)建多個子進(jìn)程#include#include#inclu

3、demain() int i,j;printf(“ My pid is %d, my fatherns”pid,getpid()is%d,getppid();for(i=0; i3; i+)if(fork()=0)printf(“ %d pid=%d ppid=%dn” , i,getpid(),getppid();else j=wait(0);Printf(“ %d:The chile %d is finished”. ,getpid(),j);運(yùn)行結(jié)果:思考:畫出進(jìn)程的家族樹。子進(jìn)程的運(yùn)行環(huán)境是怎樣建立的?反復(fù)運(yùn)行此程序看會有什么情況?解釋一下。答:21440214412144521447

4、21442214442144621443子進(jìn)程的運(yùn)行環(huán)境是由將其創(chuàng)建的父進(jìn)程而建立的, 反復(fù)運(yùn)行程序會發(fā)現(xiàn)每個進(jìn)程標(biāo)識號在不斷改變,這是因?yàn)橥粫r間有許多進(jìn)程在被創(chuàng)建。例程 3:創(chuàng)建子進(jìn)程并用execlp() 系統(tǒng)調(diào)用執(zhí)行程序的實(shí)驗(yàn)#include#includemain()int child_pid1,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);

5、 /*子進(jìn)程 1 啟動其它程序 */perror(exec1 error.n );exit(1);child_pid2=fork(); /*創(chuàng)建子進(jìn)程2*/if(child_pid2=0) execlp(date,date,(char *)0); /* 子進(jìn)程 2 啟動其它程序 */ 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 啟動其它程序perror(exec3 error.n );exit(3);puts(Paren

6、t process is waiting for chile 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,(status8);elseif(child_pid2=pid) /*若子進(jìn)程2 結(jié)束 */printf(child process 2 terminated with status %dn,(status8);else if(child_pid3=pi

7、d) /*若子進(jìn)程3 結(jié)束 */printf(child process 3 terminated with status %dn ,(status8);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)行此程序看會有什么情況?解釋一下。答:子進(jìn)程運(yùn)行其他程序后,這個進(jìn)程就完全被新程序代替。由于并沒有產(chǎn)生新進(jìn)程所以進(jìn)程標(biāo)識號不改變,除此之外舊進(jìn)程的其它信息,代碼段, 數(shù)據(jù)段, 棧段等均被新程序的信息所代替。 新程序從自己

8、的 main() 函數(shù)開始運(yùn)行。 反復(fù)運(yùn)行此程序發(fā)現(xiàn)結(jié)束的先后次序是不可預(yù)知的, 每次運(yùn)行結(jié)果都不一樣。 原因是當(dāng)每個子進(jìn)程運(yùn)行其他程序時,他程序的結(jié)束而結(jié)束,所以結(jié)束的先后次序在改變。他們的結(jié)束隨著其例程 4:觀察父、子進(jìn)程對變量處理的影響#include#include#includeint globa=4;int main()pid_t pid;int vari=5;printf(before fork.n);if (pid=fork()0)printf(fork error.n);exit(0);elseif(pid=0)/* 子進(jìn)程執(zhí)行 */globa+;vari-;printf(C

9、hild %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, globa=%d, vari=%dn,getpid(),globa,vari);/* 都執(zhí)行 */exit(0);運(yùn)行結(jié)果:思考:子進(jìn)程被創(chuàng)建后,對父進(jìn)程的運(yùn)行環(huán)境有影響嗎?解釋一下。答:子進(jìn)程被創(chuàng)建后,對父進(jìn)程的運(yùn)行環(huán)境無影響,因?yàn)楫?dāng)子進(jìn)程在運(yùn)行時,它有自己的代碼段和數(shù)據(jù)段, 這些都可以作修改, 但是父

10、進(jìn)程的代碼段和數(shù)據(jù)段是不會隨著子進(jìn)程數(shù)據(jù)段和代碼段的改變而改變的。例程 5:管道通信的實(shí)驗(yàn)#include#includemain()int i,r,j,k,l,p1,p2,fd2;char buf50,s50;pipe(fd);while(p1=fork()=-1);if(p1=0)lockf(fd1,1,0);/* 子進(jìn)程 1 執(zhí)行 */* 管道寫入端加鎖*/sprintf(buf,Child process P1 is sending messages! n);printf(Child process P1! n);write(fd1,buf,50);lockf(fd1,0,0);/*

11、信息寫入管道 */* 管道寫入端解鎖*/sleep(5);j=getpid();k=getppid();printf(P1 %d is weakup. My parent process 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í)行 */ /* 管道寫入端加鎖 */sprintf(buf,Child process P2 is sending messages! n);printf(Child process P2! n);write(fd1,b

12、uf,50);lockf(fd1,0,0);/* 信息寫入管道 */* 管道寫入端解鎖*/sleep(5);j=getpid();k=getppid();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(Cant read pipe. n); elseprintf(Parent %d: %s n,l,s); wait(0); if(r=read(fd0,s,50)=-1) printf(Cant re

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

14、時被喚醒。( 3)加鎖、解鎖是為了解決臨界資源的共享問題。 不用它將會引起無法有效的管理數(shù)據(jù),即數(shù)據(jù)會被修改導(dǎo)致讀錯了數(shù)據(jù)。例程 7:軟中斷信號實(shí)驗(yàn)#include#includemain()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ā)送信號*/printf(Parent: signal 18 has been sent to child %d,returned %d.n,i,j);k=wait();/* 父進(jìn)程被喚醒 */printf(After wait

15、%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é)束信號*/func()/* 處理程序 */ int m; m=getpid();printf(I am Process %d: It is signal 18 processing function.n,m);運(yùn)行結(jié)果:思考:討論一下它與硬中斷有什么區(qū)別?答:硬中斷是由外部硬件產(chǎn)生的,而軟中斷是CPU根據(jù)軟件的某

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

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

18、插入就緒隊(duì)列。進(jìn)程控制如何實(shí)現(xiàn)的?答:為了描述和控制進(jìn)程的運(yùn)行,系統(tǒng)為每個進(jìn)程定義了一個數(shù)據(jù)結(jié)構(gòu)進(jìn)程控制塊PCB,它是進(jìn)程實(shí)體的一部分,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。PCB中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息。當(dāng)系統(tǒng)創(chuàng)建一個新進(jìn)程時,就為它建立了一個PCB;進(jìn)程結(jié)束時又回收其PCB,進(jìn)程于是也隨之消亡。進(jìn)程通信方式各有什么特點(diǎn)?答:高級通信機(jī)制可歸結(jié)為三大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)以及管道通信系統(tǒng)。在共享存儲器系統(tǒng)中, 相互通信的進(jìn)程共享某些數(shù)據(jù)結(jié)構(gòu)或共享存儲區(qū), 進(jìn)程之間能夠通過這些空間進(jìn)行通信。消息傳遞系統(tǒng)中,進(jìn)程間的數(shù)據(jù)交換是以格式化的消息為單位的。管道通信系統(tǒng)能有效地傳送大量數(shù)據(jù),因而又被引入到許多其它操作系統(tǒng)中。管道通信如何實(shí)現(xiàn)?該通信方式可以用在何

溫馨提示

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

最新文檔

評論

0/150

提交評論