版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗一進程管理1 .實驗目的:(1)加深對進程概念的理解,明確進程和程序的區(qū)別;(2)進一步認識并發(fā)執(zhí)行的實質;(3)分析進程爭用資源的現象,學習解決進程互斥的方法;(4) 了解Linux系統(tǒng)中進程通信的基本原理。2 .實驗預備內容(1)閱讀Linux的sched.h源碼文件,加深對進程管理概念的理解;(2)閱讀Linux的fork()源碼文件,分析進程的創(chuàng)建過程。3 .實驗內容(1)進程的創(chuàng)建:編寫一段程序,使用系統(tǒng)調用fork()創(chuàng)建兩個子進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示字符“ a,”子進程分別顯示字符“t “c”試觀
2、察記錄屏幕上的顯示結果,并分析原因。源代碼如下:#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)printf
3、("bn");elsepid2 = fork();if(pid2<0)fprintf(stderr,"childprocess1 failed"); exit(-1);else if(pid2 = 0) printf("cn");elseprintf("an");sleep(2);exit(0);return 0;結果如下:hanchunyanubuntu:"5 ./a.out c b分析原因:pid=fork();操作系統(tǒng)創(chuàng)建一個新的進程(子進程),并且在進程表中相應為它建立一個新的表項。新進程和
4、原有進程的可執(zhí)行程序是同一個程序;上下文和數據,絕大部分就是 原進程(父進程)的拷貝,但它們是兩個相互獨立的進程! 因此,這三個進程哪個先執(zhí)行,哪個后執(zhí)行,完全取決于操作系統(tǒng)的調度,沒 有固定的順序。(2)進程的控制修改已經編寫的程序,將每個進程輸出一個字符改為每個進程輸出一句話,再觀察程 序執(zhí)行時屏幕上出現的現象,并分析原因。將父進程的輸出改為 father process completed輸出b的子進程改為輸出 child processl completed輸出c的子進程改為輸出 child process2 completed運行的結果如下:理由同(1)如果在程序中使用系統(tǒng)調用loc
5、kf ()來給每一個進程加鎖,可以實現進程之間的互斥,觀察并分析出現的現象。加鎖之后的代碼:#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;pidl = fork();if(pid1<0)fprintf(stderr,"childprocess1 failed");exit(-1);el
6、se if(pid1 = 0)lockf(1,1,0);printf("child processl completedn");elsepid2 = fork();if(pid2<0)fprintf(stderr,"childprocess1 failed");exit(-1);else if(pid2 = 0)lockf(1,1,0);printf("child process2 completedn");elselockf(1,1,0);printf( " father process is completedn
7、");sleep(2);exit(0);return 0;hanchunyaneubuntui't ./a.out father process completed child proces52 completed child processl completed hanchunyanfiu buntu:$所謂進程互斥,是指兩個或兩個以上的進程,不能同時進入關于同一組共享變量的臨界區(qū)域,否則可能發(fā)生與時間有關的錯誤,這種現象被稱作進程互斥.lockf()函數是將文件區(qū)域用作信號量(監(jiān)視鎖),或控制對鎖定進程 的訪問(強制模式記錄鎖定)。試圖訪問已鎖定資源的其他進程將返回錯誤或
8、 進入休態(tài),直到資源解除鎖定為止。而上面三個進程,不存在要同時進入同一 組共享變量的臨界區(qū)域的現象,因此輸出和原來相同。(3)a)編寫一段程序,使其實現進程的軟中斷通信。要求:使用系統(tǒng)調用fork()創(chuàng)建兩個子進程,再用系統(tǒng)調用 signal()讓父進程捕捉鍵盤上來的中斷信號(即按 DEL鍵);當捕捉到中斷信號后,父進程用系統(tǒng)調用Kill()向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child Process 1 is killed by Parent!Child Process 2 is killed by Parent!父進程等待兩個子進程終止后,輸出如下的信息后終止
9、:Parent Process is killed!代碼如下:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include <fcntl.h>#include <errno.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;pidl = fork();if(pid1&l
10、t;0)fprintf(stderr,"childprocess1 failed");exit(-1);else if(pid1 = 0)wf = 1;signal(16,stop);/捕捉到父進程傳來的16信號,繼續(xù)往下執(zhí)行waiting。;/不往下執(zhí)行 lockf(1,1,0);printf("Child Process 1 is killed by Parent!n");lockf(1,0,0);exit(0);elsepid2 = fork();if(pid2<0)fprintf(stderr,"childprocess1 fai
11、led");exit(-1);else if(pid2 = 0)wf = 1;signal(17,stop);/捕捉到父進程傳來的17信號,繼續(xù)往下執(zhí)行 waiting。;/不往下執(zhí)行 lockf(1,1,0);printf("Child Process 2 is killed by Parent!n");lockf(1,0,0);exit(0);elsewf = 1;/wf為1時,不往下執(zhí)行,直到捕捉到鍵盤上傳來的信號 signal(SIGINT,stop);捕捉到鍵盤傳來的信號,執(zhí)行 stop函數waiting。;kill(pid1,16);向子進程p1發(fā)軟中
12、斷信 號16kill(pid2,17);向子進程p2發(fā)軟中斷信號17wait(0);wait(0);printf("Parent Process is killed!n");exit(0);return 0;按下ctrl+c后,運行結果如下:卜CPdrnt Precess is killed!軟中斷一般是指由指令int引起的“偽”中斷動作一一給 CPU制造一個中斷的 假象;而硬中斷則是實實在在由 8259的連線觸發(fā)的中斷。kill函數的原型如 下:int kill(pid,sig) , pid是一個或一組進程的標識符,參數 sig是要發(fā) 送的軟中斷信號。signal 函數的
13、原型如下:signal(sig,function) ,它以軟 中斷信號的序號作為參數調用函數,也就是說,收到軟中斷信號sig后,調用函數function.當子進程1收到軟中斷信號 16時,調用函數 stop()解除“waiting ”,繼續(xù)往下執(zhí)行;等它打印完了child process 1 is killed byparent,就退出;對于子進程2來說也是如此。而父進程在此階段一直處于“waiting ”狀態(tài)(執(zhí)行 wait(0),直到兩個子進程都退出了,父進程才會退 出。由于ctrl+c信號會并發(fā)傳到每個進程中,進程受到該信號會立刻終止。當 子進程收到ctrl+c信號時,就終止了,根本不會
14、等父進程傳來的軟中斷信號, 因此也就不會打印出 child process1 is killed 和 child process2 is killed.b)在上面的程序中增加語句signal(SIGINT, SIG-IGN)和 signal(SIGQUIT, SIG-IGN),觀察執(zhí)行結果,并分析原因。按下ctrl+c后,運行結果如下:ianchuryanubuntu:./a.out'CChitd Process 1 is killed by Pa rent!Child Process 2 is killed by Pa rent3 Parent Process is killed!s
15、ignal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN) 的作用是屏蔽從 鍵盤上傳來的中斷信號,因此子進程可以接收到父進程傳來的軟中斷信號,進 而將那兩句話打印出來(4)進程的管道通信編制一段程序,實現進程的管道通信。使用系統(tǒng)調用pipe()建立一條管道線;兩個子進程 P1和P2分別向管道各寫一句話:Child 1 is sending a message!Child 2 is sending a message!而父進程則從管道中讀出來自于兩個子進程的信息,顯示在屏幕上。要求父進程先接收子進程P1發(fā)來的消息,然后再接收子進程P2發(fā)來的消息。源代碼如下
16、:#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 failed");exit(-1)
17、;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);elsepid2 = fork();if(pid2<0)fprintf(stderr,"childprocess1 failed");exit(-1);else if(pid2 = 0)lockf(fd1,1,0);sprintf(childbuf,"
18、;Child 1 is sending a message!n");write(fd1,childbuf,50);/ 向管道中寫東西sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);/等待某個子進程結束read(fd0,parbuf,50);/從管道中讀東西printf("%s",parbuf);wait(0);/等待某個子進程結束read(fd0,parbuf,50);/ 從管道中讀東西 printf("%s",parbuf);exit(0);return 0;運行結果如下:hnchuryanBLibun
19、tu: . /a. out Child 1 is sending a message! Child 2 is sendina a messaae!值得注意的是,pipe(fd);pid1 = fork();這兩句的位置不能調換,否則會出現下 面結果:hanchunyanuburtu:. /a.outChild 1 is sending a message!也就是說,只有子進程1向通過管道向父進程發(fā)送信息,且程序一直不退出 用strace命令追查,可發(fā)現writef 1, "Child 1 is sending a message!?echild 1 is sending a mess
20、age!卜二wait4-1( NULL.% NULL)= 26659d如果先fork ,那么在fork之后就是兩個獨立的進程,在兩個獨立進程中分別調 用pipe得到的是兩個獨立的fd數組,向子進程的fd1寫入,從父進程的 fd0讀取,父進程會堵在 read上,因為根本就沒有進程在寫父進程的 fd1。4.思考(1)系統(tǒng)是怎樣創(chuàng)建流程的?系統(tǒng)通過調用fork函數創(chuàng)建進程,當一個進程調用了 fork以后,系統(tǒng)會創(chuàng) 建一個子進程.這個子進程和父進程不同的地方只有他的 進程ID和父 進程ID, 其他的都是一樣.就象符進程 克隆(clone)自己一樣.而此時子進程也與父進程 分道揚鍍,各自執(zhí)行自己的操作。至于先執(zhí)行子進程,還是先執(zhí)行父進程,取 決去內核的調度算法。一旦子進程被創(chuàng)建,父子進程相互競爭系統(tǒng)的資源.有 時候我們希望子進程繼續(xù)執(zhí)行,而父進程阻塞直到子 進程完成任務.這個時候我 們可以調用wait或者waitpid 系統(tǒng)調用.(2)可執(zhí)行文件加載時進行了哪些處理?注冊一個可執(zhí)行文件的加載模塊(包含信息:鏈表 list,所屬的module, 加載可執(zhí)行文件,加載共享庫),然后遍歷鏈表,依次按 module加載這個可執(zhí) 行文件(3)當首次調用新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能在醫(yī)療診斷中的應用
- 2024年桂林鐵路醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 【2021屆備考】2020全國名校化學試題分類解析匯編(12月):H單元-水溶液中的離子平衡
- 2025年度深圳定制旅游租車服務合同范本2篇
- 全國2021屆高三英語試題8、9月分類解析:A單元-單項填空(A10情態(tài)動詞與虛擬語氣)
- 場所合法經營保證書
- 【智慧測評】2021高考生物(人教版)總復習作業(yè):必修3-第3章-植物的激素調節(jié)-階段質量檢測
- 等比數列的性質的經典總結
- 全國固體廢物管理信息系統(tǒng)
- GB2894-2008安全標志及其使用導則(高清版)
- 數學與語言學、語言藝術的交叉研究
- 2023年云南大學滇池學院教師招聘考試筆試題庫及答案
- 醫(yī)院“無陪護”病房試點工作方案
- 清華大學大學物理-光的偏振
- 心理健康教育-網絡與青少年
- 高中英語人教版(2019) 選擇性必修一 Unit 3 課文語法填空(含答案)
- 2021-2022學年陜西省寶雞市陳倉區(qū)北師大版六年級上冊期末考試數學試卷(含答案解析)
- 水工-建筑物課件
- 應用PDCA提高入院宣教的知曉率
- 線性系統(tǒng)理論鄭大鐘307張課件
- 2019-2020學年第一學期廣東省廣州市天河區(qū)3年級數學期末考試卷
評論
0/150
提交評論