2019電大操作系統(tǒng)形考任務(wù)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第1頁(yè)
2019電大操作系統(tǒng)形考任務(wù)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第2頁(yè)
2019電大操作系統(tǒng)形考任務(wù)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第3頁(yè)
2019電大操作系統(tǒng)形考任務(wù)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第4頁(yè)
2019電大操作系統(tǒng)形考任務(wù)進(jìn)程管理實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩6頁(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、精選優(yōu)質(zhì)文檔-傾情為你奉上進(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實(shí)驗(yàn)內(nèi)容(1)進(jìn)程的創(chuàng)建:編寫一段程序,使用系統(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)程分別顯示字符“

2、b”和“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。源代碼如下:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include <fcntl.h>#include <errno.h>int main(int argc,char* argv)pid_t pid1,pid2; pid1 = fork(); if(pid1<0)fprintf(stderr,"childprocess1 failed");exit(-1);else if(pid1

3、= 0) printf("bn");else pid2 = fork(); if(pid2<0) fprintf(stderr,"childprocess1 failed"); exit(-1);else if(pid2 = 0) printf("cn");else printf("an");sleep(2);exit(0); return 0;結(jié)果如下:分析原因: pid=fork(); 操作系統(tǒng)創(chuàng)建一個(gè)新的進(jìn)程(子進(jìn)程),并且 在進(jìn)程表中相應(yīng)為它建立一個(gè)新的表項(xiàng)。新進(jìn)程和原有進(jìn)程的可執(zhí)行程序是同一個(gè)程序;

4、上下文和數(shù)據(jù),絕大部分就是 原進(jìn)程(父進(jìn)程)的拷貝,但它們是兩個(gè)相互獨(dú)立的進(jìn)程!因此,這三個(gè)進(jìn)程哪個(gè)先執(zhí)行,哪個(gè)后執(zhí)行,完全取決于操作系統(tǒng)的調(diào)度,沒有固定的順序。(2)進(jìn)程的控制修改已經(jīng)編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析原因。將父進(jìn)程的輸出改為father process completed輸出b的子進(jìn)程改為輸出child process1 completed輸出c的子進(jìn)程改為輸出child process2 completed運(yùn)行的結(jié)果如下:理由同(1) 如果在程序中使用系統(tǒng)調(diào)用lockf () 來給每一個(gè)進(jìn)程加鎖,可以實(shí)現(xiàn)進(jìn)程

5、之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。加鎖之后的代碼:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include <fcntl.h>#include <errno.h>int main(int argc,char* argv) pid_t pid1,pid2; pid1 = fork(); if(pid1<0) fprintf(stderr,"childprocess1 failed");exit(-1); else if(pid1 = 0)

6、lockf(1,1,0); printf("child process1 completedn"); elsepid2 = fork();if(pid2<0) fprintf(stderr,"childprocess1 failed"); exit(-1);else if(pid2 = 0) lockf(1,1,0); printf("child process2 completedn");else lockf(1,1,0);printf(“father process is completedn”); sleep(2); ex

7、it(0); return 0;所謂進(jìn)程互斥,是指兩個(gè)或兩個(gè)以上的進(jìn)程,不能同時(shí)進(jìn)入關(guān)于同一組共享變量的臨界區(qū)域,否則可能發(fā)生與時(shí)間有關(guān)的錯(cuò)誤,這種現(xiàn)象被稱作進(jìn)程互斥.lockf()函數(shù)是將文件區(qū)域用作信號(hào)量(監(jiān)視鎖),或控制對(duì)鎖定進(jìn)程的訪問(強(qiáng)制模式記錄鎖定)。試圖訪問已鎖定資源的其他進(jìn)程將返回錯(cuò)誤或進(jìn)入休態(tài),直到資源解除鎖定為止。而上面三個(gè)進(jìn)程,不存在要同時(shí)進(jìn)入同一組共享變量的臨界區(qū)域的現(xiàn)象,因此輸出和原來相同。(3)a) 編寫一段程序,使其實(shí)現(xiàn)進(jìn)程的軟中斷通信。要求:使用系統(tǒng)調(diào)用fork() 創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal() 讓父進(jìn)程捕捉鍵盤上來的中斷信號(hào)(即按DEL鍵);當(dāng)

8、捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用Kill() 向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出下列信息后終止:Child Process 1 is killed by Parent!Child Process 2 is killed by Parent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下的信息后終止:Parent Process is killed!代碼如下:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include <fcntl.h>#include <errno.

9、h>#include <signal.h>int wf;void waiting() while(wf!=0);void stop() wf = 0;int main(int argc,char* argv) pid_t pid1,pid2; pid1 = fork(); if(pid1<0) fprintf(stderr,"childprocess1 failed"); exit(-1); else if(pid1 = 0)wf = 1;signal(16,stop);/捕捉到父進(jìn)程傳來的16信號(hào),繼續(xù)往下執(zhí)行 waiting();/不往下執(zhí)行 l

10、ockf(1,1,0); printf("Child Process 1 is killed by Parent!n"); lockf(1,0,0); exit(0); else pid2 = fork(); if(pid2<0) fprintf(stderr,"childprocess1 failed"); exit(-1); else if(pid2 = 0) wf = 1; signal(17,stop);/捕捉到父進(jìn)程傳來的17信號(hào),繼續(xù)往下執(zhí)行 waiting();/不往下執(zhí)行 lockf(1,1,0); printf("Chi

11、ld Process 2 is killed by Parent!n"); lockf(1,0,0); exit(0); else wf = 1;/wf為1時(shí),不往下執(zhí)行,直到捕捉到鍵盤上傳來的信號(hào) signal(SIGINT,stop);/捕捉到鍵盤傳來的信號(hào),執(zhí)行stop函數(shù) waiting(); kill(pid1,16);/向子進(jìn)程p1發(fā)軟中斷信號(hào)16 kill(pid2,17);/向子進(jìn)程p2發(fā)軟中斷信號(hào)17 wait(0); wait(0); printf("Parent Process is killed!n"); exit(0); return 0

12、;按下ctrl+c后,運(yùn)行結(jié)果如下:軟中斷一般是指由指令int引起的“偽”中斷動(dòng)作給CPU制造一個(gè)中斷的假象;而硬中斷則是實(shí)實(shí)在在由8259的連線觸發(fā)的中斷。kill函數(shù)的原型如下:int  kill(pid,sig),pid 是一個(gè)或一組進(jìn)程的標(biāo)識(shí)符,參數(shù)sig是要發(fā)送的軟中斷信號(hào)。signal函數(shù)的原型如下:signal(sig,function),它以 軟中斷信號(hào)的序號(hào)作為參數(shù)調(diào)用函數(shù),也就是說,收到軟中斷信號(hào)sig后,調(diào)用函數(shù)function.當(dāng)子進(jìn)程1收到軟中斷信號(hào)16時(shí),調(diào)用函數(shù)stop()解除“waiting”,繼續(xù)往下執(zhí)行;等它打印完了child process 1

13、is killed by parent,就退出;對(duì)于子進(jìn)程2來說也是如此。而父進(jìn)程在此階段一直處于“waiting”狀態(tài)(執(zhí)行wait(0),直到兩個(gè)子進(jìn)程都退出了,父進(jìn)程才會(huì)退出。由于ctrl+c信號(hào)會(huì)并發(fā)傳到每個(gè)進(jìn)程中,進(jìn)程受到該信號(hào)會(huì)立刻終止。當(dāng)子進(jìn)程收到ctrl+c信號(hào)時(shí),就終止了,根本不會(huì)等父進(jìn)程傳來的軟中斷信號(hào),因此也就不會(huì)打印出child process1 is killed和child process2 is killed.b) 在上面的程序中增加語句signal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN),觀察執(zhí)行結(jié)果,并分析原因。

14、按下ctrl+c后,運(yùn)行結(jié)果如下:signal(SIGINT, SIG-IGN)和signal(SIGQUIT, SIG-IGN)的作用是屏蔽從鍵盤上傳來的中斷信號(hào),因此子進(jìn)程可以接收到父進(jìn)程傳來的軟中斷信號(hào),進(jìn)而將那兩句話打印出來(4)進(jì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)程

15、P2發(fā)來的消息。源代碼如下:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include <fcntl.h>#include <errno.h>int main(int argc,char* argv) pid_t pid1,pid2; int fd2; char parbuf50,childbuf50; pipe(fd);/建立管道pid1 = fork();if(pid1<0) fprintf(stderr,"childprocess2 faile

16、d"); exit(-1);else if(pid1 = 0) lockf(fd1,1,0); sprintf(childbuf,"Child 2 is sending a message!n"); write(fd1,childbuf,50);/向管道中寫東西sleep(5);lockf(fd1,0,0);exit(0);else pid2 = fork(); if(pid2<0) fprintf(stderr,"childprocess1 failed"); exit(-1); else if(pid2 = 0) lockf(fd1,

17、1,0); sprintf(childbuf,"Child 1 is sending a message!n"); write(fd1,childbuf,50);/向管道中寫東西 sleep(5);lockf(fd1,0,0);exit(0);else wait(0);/等待某個(gè)子進(jìn)程結(jié)束 read(fd0,parbuf,50);/從管道中讀東西 printf("%s",parbuf); wait(0);/等待某個(gè)子進(jìn)程結(jié)束read(fd0,parbuf,50);/從管道中讀東西printf("%s",parbuf);exit(0);

18、 return 0;運(yùn)行結(jié)果如下:值得注意的是,pipe(fd);pid1 = fork();這兩句的位置不能調(diào)換,否則會(huì)出現(xiàn)下面結(jié)果:也就是說,只有子進(jìn)程1向通過管道向父進(jìn)程發(fā)送信息,且程序一直不退出。用strace命令追查,可發(fā)現(xiàn)如果先fork,那么在fork之后就是兩個(gè)獨(dú)立的進(jìn)程,在兩個(gè)獨(dú)立進(jìn)程中分別調(diào)用pipe得到的是兩個(gè)獨(dú)立的fd數(shù)組,向子進(jìn)程的fd1寫 入,從父進(jìn)程的fd0讀取,父進(jìn)程會(huì)堵在read上,因?yàn)楦揪蜎]有進(jìn)程在寫父進(jìn)程的fd1 。4思考(1)系統(tǒng)是怎樣創(chuàng)建流程的? 系統(tǒng)通過調(diào)用fork函數(shù)創(chuàng)建進(jìn)程,當(dāng)一個(gè)進(jìn)程調(diào)用了fork以后,系統(tǒng)會(huì)創(chuàng)建一個(gè)子進(jìn)程.這個(gè)子進(jìn)程和父進(jìn)程不

19、同的地方只有他的進(jìn)程ID和父 進(jìn)程ID,其他的都是一樣.就象符進(jìn)程 克隆(clone)自己一樣.而此時(shí)子進(jìn)程也與父進(jìn)程分道揚(yáng)鑣,各自執(zhí)行自己的操作。至于先執(zhí)行子進(jìn)程,還是先執(zhí)行父進(jìn)程,取決去內(nèi)核的調(diào)度算法。 一旦子進(jìn)程被創(chuàng)建,父子進(jìn)程相互競(jìng)爭(zhēng)系統(tǒng)的資源.有時(shí)候我們希望子進(jìn)程繼續(xù)執(zhí)行,而父進(jìn)程阻塞直到子進(jìn)程完成任務(wù).這個(gè)時(shí)候我們可以調(diào)用wait或者 waitpid系統(tǒng)調(diào)用.  (2)可執(zhí)行文件加載時(shí)進(jìn)行了哪些處理? 注冊(cè)一個(gè)可執(zhí)行文件的加載模塊(包含信息:鏈表list,所屬的module,加載可執(zhí)行文件,加載共享庫(kù)),然后遍歷鏈表,依次按module加載這個(gè)可執(zhí)行文件 (3)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里? 在進(jìn)程隊(duì)列的ready狀態(tài)下,由離自己最近的父進(jìn)程執(zhí)行調(diào)度,即入口在最

溫馨提示

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