操作系統(tǒng) (第三次、第四次實驗)_第1頁
操作系統(tǒng) (第三次、第四次實驗)_第2頁
操作系統(tǒng) (第三次、第四次實驗)_第3頁
操作系統(tǒng) (第三次、第四次實驗)_第4頁
操作系統(tǒng) (第三次、第四次實驗)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程實驗報告姓名XX學(xué)號1001010127系計算機任課教師XX指導(dǎo)教師XX評閱教師賀輝實驗地點綜合樓B102實驗時間2012/10/24實驗課表現(xiàn)出勤和個人表現(xiàn)Q1(15+15(組長評分)=30分)得分:實驗總分(Q1+Q2+Q3)實驗完成情況Q2(60分)得分:體會實驗過程中遇到的問題解決辦法與實驗體會Q3(10分)得分:實驗編號與實驗名稱:實驗?zāi)康模?  管理Linux系統(tǒng)進程1) 回顧系統(tǒng)進程的概念,加深對Linux / UNIX進程管理的理解。2) 回顧ps命令和選項。3) 列出當前shell中的進程。4) 列出運行在系統(tǒng)中的所有進程。2  進程

2、互斥實驗1、進一步認識并發(fā)執(zhí)行的實質(zhì)2、通過分析實驗結(jié)果,分析進程競爭資源的現(xiàn)象,學(xué)習(xí)解決進程互斥的方法 3  進程的控制實驗1、掌握進程另外的創(chuàng)建方法:需認真分析實驗結(jié)果,體會本次實驗進程創(chuàng)建方法與fork的不同2、通過分析實驗結(jié)果,熟悉進程的睡眠、同步、撤消等進程控制方法實驗內(nèi)容    1、用fork( )創(chuàng)建一個進程,再調(diào)用exec( )用新的程序替換該子進程的內(nèi)容2、利用wait( )來控制進程執(zhí)行順序?qū)嶒瀮?nèi)容及要求(詳見實驗講義與實驗指導(dǎo)書):實驗用到的軟件(:)實驗內(nèi)容及關(guān)鍵步驟(代碼)Q2(60分)步驟1:登錄進入Linux。步驟2:訪問命

3、令行。單擊“系統(tǒng)工具”-“終端”命令,打開“終端”窗口。步驟3:回顧系統(tǒng)進程概念。每個運行的程序都會創(chuàng)建一個進程,進程分配到一個唯一的進程標識符 (PID) 。PID被系統(tǒng)用于標識和跟蹤進程,直到進程結(jié)束。1) Linux系統(tǒng)中,幾乎每一個啟動的進程,都會由內(nèi)核分配一個唯一的_PID_,用于跟蹤從進程啟動到進程結(jié)束。2) 當啟動新進程的時候,內(nèi)核也給它們分配系統(tǒng)資源,如_CPU_和_RAM_。3) 永遠不向父進程返回輸出的進程叫做_僵進程_。4) 由父進程派生出來的進程叫做_子_進程。5) _父_進程是一個派生另一個進程的進程。6) 運行用于提供服務(wù)的Linux系統(tǒng)進程是_ sched (調(diào)度

4、) 和init (初始化)_。7) 如果父進程在子進程之前結(jié)束,它創(chuàng)建了一個_孤兒_進程。步驟5:列出系統(tǒng)中運行的所有進程。輸入 ps -ef 命令,顯示運行在系統(tǒng)中的各個進程的完全信息。執(zhí)行該命令,并與ps f命令的輸出結(jié)果對照,一致嗎?有何不同? 不一致:Ps ef:Ps f:Ps ef表示的是所有進程的完整列表,而ps f表示的是一個進程的完整列表。在范圍上不一樣。注意分析當前終端窗口中的輸出結(jié)果:a. 顯示了多少個進程?_144_b. PID是什么?進程的進程標識號。PID可以用來殺死進程_c. 啟動進程的命令 (CMD) 是什么?命令名守護進程執(zhí)行的程序的名字_d. 請觀察,什么命令

5、的PID號是1?_sbin/init_e. 再次運行  ps -ef | wc -l命令,計算進程的數(shù)目并把輸出結(jié)果輸入到wc命令中:_144_執(zhí)行 man ps命令,可以打開Linux用戶命令手冊,了解ps命令的用法,輸入wq命令可退出用戶手冊的閱讀。man命令可以執(zhí)行嗎?結(jié)果如何?可執(zhí)行_試調(diào)試下二段代碼。并寫明結(jié)果(考慮fork與sleep是什么函數(shù))1.int main()int p1,i;while (p1=fork()=-1);if (p1>0)    for (i=0;i<5;i+)    

6、0;       printf("I am parent.n");        sleep(1);    else    for (i=0;i<5;i+)            printf("I am child.n");   &

7、#160;    sleep(1);    return 0;結(jié)果:2、int main()int p1,i;while (p1=fork()=-1);if (p1>0)            wait(0);        for (i=0;i<5;i+)         &

8、#160;          printf("I am parent.n");            sleep(1);            else            fo

9、r (i=0;i<5;i+)                    printf("I am child.n");            sleep(1);           

10、60;    exit(0);    return 0;結(jié)果:父子進程到底誰先得到調(diào)度執(zhí)行是由操作系統(tǒng)在運行時決定的,而且系統(tǒng)中也不止這兩個進程,所以即使你使用了sleep讓它睡眠,誰先運行誰后運行也是不確定的。而且每次運行的結(jié)果也不一樣Fork()函數(shù): 一個現(xiàn)有進程可以調(diào)用fork函數(shù)創(chuàng)建一個新進程。由fork創(chuàng)建的新進程被稱為子進程(child process)。fork函數(shù)被調(diào)用一次但返回兩次 Sleep()函數(shù):執(zhí)行掛起一段時間 ,就是在執(zhí)行的過程中,讓執(zhí)行停頓一下!2  進程互斥實驗1. 修改以下代碼,用lock

11、f( )來給每一個進程加鎖,以實現(xiàn)進程之間的互斥 /=#include <stdio.h>main( )int p1,p2;while(p1=fork( )= = -1);        /*創(chuàng)建子進程p1*/if (p1= =0)  putchar('b');       elsewhile(p2=fork( )= = -1);   /*創(chuàng)建子進程p2*/if(p2= =0)  putc

12、har('c');  else  putchar('a');    答案:循環(huán)十次:答案:很容易看出答案不一樣了,bc的順序倒過來了!沒有加鎖的答案:2、#include <stdio.h>main( )int p1,p2,i;while(p1=fork( )= = -1);          /*創(chuàng)建子進程p1*/if (p1= =0)  for(i=0;i<10;i+)pr

13、intf("daughter  %dn",i);else                while(p2=fork( )= = -1);   /*創(chuàng)建子進程p2*/if(p2= =0)                  for(i

14、=0;i<10;i+)                       printf("son  %dn",i);else                  for(i=0;i&

15、lt;10;i+)                       printf("parent  %dn",i);答案:這個程序和上面的程序是一樣原理的,沒有什么可比性,我就不執(zhí)行這個程序了!循環(huán)輸出也在上面的程序執(zhí)行了?。ㄋ模┓治鲆韵鲁绦虻妮敵鼋Y(jié)果【寫進實驗報告】:#include<stdio.h>#include<unistd.

16、h>main()int p1,p2,i;int *fp;fp = fopen("to_be_locked.txt"            ,"w+");if(fp=NULL)      printf("Fail to create file");    exit(-1);   while(p1=fork( )= -1); 

17、      /*創(chuàng)建子進程p1*/if (p1=0)lockf(*fp,1,0);              /*加鎖*/for(i=0;i<10;i+)    fprintf(fp,"daughter %dn",i);  lockf(*fp,0,0);        &#

18、160;     /*解鎖*/else   while(p2=fork( )=-1);  /*創(chuàng)建子進程p2*/if (p2=0)lockf(*fp,1,0);        /*加鎖*/for(i=0;i<10;i+)fprintf(fp,"son %dn",i);lockf(*fp,0,0);        /*解鎖*/else  

19、60;       wait(NULL);      lockf(*fp,1,0);         /*加鎖*/      for(i=0;i<10;i+)      fprintf(fp,"parent %dn",i);      lock

20、f(*fp,0,0);         /*解鎖*/   fclose(fp);答案:分析:程序開始定義了文件讀寫指針用于打開指定的文件,當文件不存在時則自動創(chuàng)建。然后有創(chuàng)建了一個進程p1,p1獲得處理機執(zhí)行,給文件讀寫指針加鎖,這樣,即使p1失去處理機,其他獲得處理機的進程也無法訪問文件指針指向的文件,當p1再次獲得處理機后繼續(xù)執(zhí)行直至進程p1結(jié)束并解鎖;p1結(jié)束后父進程獲得處理機執(zhí)行又創(chuàng)建了進程p2,p2獲得處理機執(zhí)行,也給文件指針加鎖,同理直至p2運行完解鎖;p2結(jié)束后父進程獲得處理機,父

21、進程也給文件指針加鎖,直至父進程執(zhí)行完畢解鎖,程序結(jié)束。 3  進程的控制實驗實驗內(nèi)容    1、用fork( )創(chuàng)建一個進程,再調(diào)用exec( )用新的程序替換該子進程的內(nèi)容2、 利用wait( )來控制進程執(zhí)行順序(1) 如何更新子進程內(nèi)容? 答案:系統(tǒng)調(diào)用exec( )將一個可執(zhí)行的二進制文件覆蓋在新進程的用戶級上下文的存儲空間上,改變調(diào)用進程的執(zhí)行代碼,從而形成新進程。用fork( )建立子進程,然后在子進程中使用exec( ),這樣就實現(xiàn)了父進程與一個與它完全不同子進程的并發(fā)執(zhí)行。(2) 可執(zhí)行文件加載時進行了哪些處理?答案:可執(zhí)行文件加載時首先是創(chuàng)建一個新進程的fork系統(tǒng)調(diào)用,然后用于實現(xiàn)進程自我終止的exit系統(tǒng)調(diào)用;改變進程原有代碼的exec系統(tǒng)調(diào)用;用于將調(diào)用進程掛起并等待子進程終止的wait系統(tǒng)調(diào)用;獲得進程標識符的getpid系統(tǒng)調(diào)用等處理過程。 (3)什么是進程同步?wait( )是如何實現(xiàn)進程同步的? 答案:把異步環(huán)境下的一組并發(fā)進程因直接制約

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論