實驗2--進(jìn)程觀察實驗_第1頁
實驗2--進(jìn)程觀察實驗_第2頁
實驗2--進(jìn)程觀察實驗_第3頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、實驗二 進(jìn)程觀察實驗二 :進(jìn)程的控制實驗?zāi)康?、了解進(jìn)程創(chuàng)立后對進(jìn)程控制的系統(tǒng)調(diào)用,可實現(xiàn)對進(jìn)程的有效控制2、掌握進(jìn)程的睡眠、同步、撤消等進(jìn)程控制方法實驗內(nèi)容1、通過相關(guān)命令,對進(jìn)程的狀態(tài)進(jìn)行控制。2、編寫程序,使用 fork( ) 創(chuàng)立一個子進(jìn)程。使用相關(guān)的系統(tǒng)調(diào)用控制進(jìn)程的狀態(tài)。觀察并 分析多進(jìn)程的執(zhí)行次序及狀態(tài)轉(zhuǎn)換。實驗根底一、進(jìn)程的控制進(jìn)程因創(chuàng)立而存在,因執(zhí)行完成或異常原因而終止.在進(jìn)程的生命周期中,進(jìn)程在內(nèi)存中有三種根本狀態(tài) :就緒,執(zhí)行,阻塞 .進(jìn)程狀態(tài)的轉(zhuǎn)換是通過進(jìn)程控制原語來實現(xiàn)的。Linux 操作系統(tǒng)提供了相應(yīng)功能的系統(tǒng)調(diào)用及命令,來實現(xiàn)用戶層的進(jìn)程控制。二、相關(guān)的命令1睡眠

2、指定時間執(zhí)行格式: # sleep xx 為指定睡眠的秒數(shù)。2結(jié)束或終止進(jìn)程kill執(zhí)行格式: # kill -9 PID PID 為利用 ps 命令所查出的 process ID 例: kill -9 456 終止 process ID 為 456 的 process3后臺 background 執(zhí)行 process command 的命令執(zhí)行格式: # command & 在命令后加上 & 注意:按下 T,暫停正在執(zhí)行的process鍵入 bg,將所暫停的 process置入background中繼續(xù)執(zhí)行。例: # gcc file1 &AZstopped # bg4查看正在 backgr

3、ound 中執(zhí)行的 process執(zhí)行格式: # jobs 5結(jié)束或終止在 background 中的進(jìn)程 kill執(zhí)行格式: # kill %n例: kill%1終止在 background 中的第一個 jobkill%2終止在 background 中的第二個 job三、相關(guān)的系統(tǒng)調(diào)用在 LINUX 中 fork( ) 是一個非常有用的系統(tǒng)調(diào)用,但在 LINUX 中建立進(jìn)程除了 fork( ) 之外,也可用與 fork( ) 配合使用的 exec( )。1、 exec( )系列系統(tǒng)調(diào)用 exec( )系列,也可用于新程序的運行。 fork( )只是將父進(jìn)程的用戶級上下文拷 貝到新進(jìn)程中,

4、而 exec( )系列可以將一個可執(zhí)行的二進(jìn)制文件覆蓋在新進(jìn)程的用戶級上下文 的存儲空間上,以更改新進(jìn)程的用戶級上下文。exec()系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個新程序裝入內(nèi)存,來改變調(diào)用進(jìn)程的執(zhí)行代碼,從而形成新進(jìn)程。如果exec( )調(diào)用成功,調(diào)用進(jìn)程將被 覆蓋, 然后從新程序的入口開始執(zhí)行,這樣就產(chǎn)生了一個新進(jìn)程, 新進(jìn)程的進(jìn)程標(biāo)識符 id 與調(diào)用進(jìn)程相同。exec( )沒有建立一個與調(diào)用進(jìn)程并發(fā)的子進(jìn)程,而是用新進(jìn)程取代了原來進(jìn)程 。所以exec()調(diào)用成功后,沒有任何數(shù)據(jù)返回,這與fork()不同。exec()系列系統(tǒng)調(diào)用在 LINUX系統(tǒng)庫 unistd.h 中,共有

5、 execl、execlp、execle、execv、execvp 五個,其根本功能相同,只是 以不同的方式來給出參數(shù)。一種是直接給出參數(shù)的指針,如:int execl(path,arg0,arg1,.argn,0);char *path,*arg0,*arg1,.,*argn;另一種是給出指向參數(shù)表的指針,如:int execv(path,argv);char *path,*argv ;另外,在linux中,出于平安的考慮,限制了exec()可以執(zhí)行的新程序的位置為系統(tǒng)指定的搜索路徑。例如:execl( “/bin/ls , ls ,NULL);execl( “ /usr/bin/gcc-v

6、 ,NU,LL);execl( ./test ,NUL當(dāng))前目錄下的可執(zhí)行程序2、 exec( )和 fork( ) 聯(lián)合使用系統(tǒng)調(diào)用 exec 和 fork( ) 聯(lián)合使用能為程序開發(fā)提供有力支持。 用 fork( ) 建立子進(jìn)程, 然 后在子進(jìn)程中使用 exec( ),這樣就實現(xiàn)了 父進(jìn)程與一個與它完全不同子進(jìn)程的并發(fā)執(zhí)行 。一般, wait、exec 聯(lián)合使用的模型為:int status;if (fork( )= =0)execl(.);wait(&status);3、wait 等待子進(jìn)程運行結(jié)束。 如果子進(jìn)程沒有完成, 父進(jìn)程一直等待。 wait( ) 將調(diào)用進(jìn)程掛起, 直至其子進(jìn)程

7、因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在 wait( )前已有子進(jìn)程暫停或終 止,那么調(diào)用進(jìn)程做適當(dāng)處理后便返回。 wait( )給我們提供了一種實現(xiàn)進(jìn)程同步的簡單方法。系統(tǒng)調(diào)用格式:int wait(status)int *status;其中, status 是用戶空間的地址。它的低 8 位反響子進(jìn)程狀態(tài),為 0 表示子進(jìn)程正常結(jié) 束,非 0 那么表示出現(xiàn)了各種各樣的問題;高 8 位那么帶回了 exit( )的返回值。 exit( )返回值由 系統(tǒng)給出。核心對 wait( ) 作以下處理:1首先查找調(diào)用進(jìn)程是否有子進(jìn)程,假設(shè)無,那么返回出錯碼; 2假設(shè)找到一處于“僵死狀態(tài)的子進(jìn)程,那么將子進(jìn)

8、程的執(zhí)行時間加到父進(jìn)程的執(zhí) 行時間上,并釋放子進(jìn)程的進(jìn)程表項;3假設(shè)未找到處于“僵死狀態(tài)的子進(jìn)程,那么調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡 眠,等待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。4、sleep 睡眠指定時間。系統(tǒng)調(diào)用格式:void sleep(int second)其中, second 為指定睡眠的秒數(shù)。該函數(shù)使得當(dāng)前進(jìn)程自我阻塞second 秒,由執(zhí)行態(tài)轉(zhuǎn)換成阻塞態(tài),直到系統(tǒng)喚醒。5、exit 終止進(jìn)程的執(zhí)行。系統(tǒng)調(diào)用格式:void exit(status)int status;其中, status 是返回給父進(jìn)程的一個整數(shù),以備查考。為了及時回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù), LINU

9、X/LINUX 利用 exit( )來實 現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)立子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。 exit(0) 表示進(jìn)程正常終止, exit(1) 表示進(jìn)程運行有錯,異常終止。如果調(diào)用進(jìn)程在執(zhí)行 exit( )時,其父進(jìn)程正在等待它的終止,那么父進(jìn)程可立即得到其返 回的整數(shù)。核心須為 exit( ) 完成以下操作:1關(guān)閉軟中斷2回收資源3寫記帳信息4置進(jìn)程為“僵死狀態(tài)實驗指導(dǎo)1、參照參考程序編寫程序,其中父進(jìn)程無限循環(huán)。在后臺執(zhí)行該程序。rootlocalhost Iab2# vi fork_1.crootlocalhost Iab2# gcc

10、fork_1.c -o def rootlocalhost Iab2# ./def &1 3620def fork_1.c子進(jìn)程用exec()裝入命令ls ,exec()后,子進(jìn)程的代碼被ls的代碼取代,這時子進(jìn)程 的PC指向ls的第1條語句,開始執(zhí)行l(wèi)s的命令代碼。如果是下面這種:rootlocalhost lab2# ./def那么只有用Ac強(qiáng)行終止父進(jìn)程,那么在第 2步結(jié)果就不同了,父子進(jìn)程都成為僵死進(jìn)程。2、顯示當(dāng)前終端上啟動的所有進(jìn)程。rootlocalhost lab2# ps -afUID PID PPID C STIME TTY TIME CMDroot362031260 20

11、:11 pts/100:00:00./defroot362136200 20:11 pts/100:00:00ls root362331260 20:12 pts/100:00:00ps -af其中, 說明進(jìn)程ls是一個僵死進(jìn)程。父進(jìn)程創(chuàng)立一個子進(jìn)程后,可以用 wait()等待回收其子進(jìn)程的資源,也可以正常終止后由系統(tǒng)回收其子進(jìn)程的資源。./def 就是 Is的父進(jìn)程。./def進(jìn)程中,既沒有等待回收其子進(jìn)程的資源,也沒有正常終止,因此 造成ls 成為一個僵死進(jìn)程。3、用kill命令直接殺死該子進(jìn)程,看看是否能夠成功?rootlocalhost lab2# kill -9 3621 rootl

12、ocalhost lab2# ps -af為什么不能殺死?因為父進(jìn)程還沒結(jié)束。4、用kill命令殺死父進(jìn)程之后呢?解釋原因。rootlocalhost lab2# kill -9 3620 rootlocalhost lab2# ps -af但是如果父子進(jìn)程都異常終止,那么shell進(jìn)程將回收其資源。Init進(jìn)程回收所有僵死進(jìn)程資源?5、修改程序 fork_1.c ,在父進(jìn)程執(zhí)行 while(1) 之前,添加代碼 wait(0); 。在后臺執(zhí)行該 程序。顯示當(dāng)前終端上啟動的所有進(jìn)程。解釋原因。6、修改以上程序,在子進(jìn)程執(zhí)行printf( “ Is son:n ); 之前添加代碼 “sleep(

13、1); 。觀察多進(jìn)程的執(zhí)行序列,解釋原因。7、選作:修改“多進(jìn)程環(huán)境實驗 中的參考程序, 在“子進(jìn)程 1段前添加代碼 “ sleep(2);, 在“父進(jìn)程段b前添加代碼“ wait(O); wait(O); 。觀察多進(jìn)程的執(zhí)行序列,解釋原因。試一 下作其它修改后的效果?參考程序#include#includemain( )int pid;pid=fork( );/*創(chuàng)立子進(jìn)程 */switch(pid)case -1:/*創(chuàng)立失敗 */printf(fork fail!n);exit(1);case 0:/*子進(jìn)程 */printf(“ Is son:n );execl(/bin/ls,ls,

14、-1,NULL);printf(exec fail!n); exit(1);default:/*父進(jìn)程 */printf(ls parent:n);while(1) sleep(1); exit(0);思考題1可執(zhí)行文件加載時進(jìn)行了哪些處理?參考程序中,什么時候執(zhí)行語句printf(execfail!n); ?2實驗指導(dǎo)中的第 5步, wait( )是如何實現(xiàn)進(jìn)程同步的?3實驗指導(dǎo)中的第 6步,sleep(1)為什么能導(dǎo)致進(jìn)程切換?創(chuàng)立進(jìn)程:#in elude #i nclude #i nclude #in elude #in elude #in elude #i nclude int mai

15、 n()pid_t pid;if(-1 = (pid = fork()prin tf(Error happe ned in fork fun cti on!n ); return 0;if(0 = pid)prin tf(This is child process: %dn, getpid();elseprin tf(This is pare nt process: %dn, getpid(); return 0;使用wait函數(shù)讓父進(jìn)程等待子進(jìn)程運行結(jié)束后才開始運行。注意,為了證明父進(jìn)程確實是等待子進(jìn)程運行結(jié)束后才繼續(xù)運行的,我們使用了sleep函數(shù)。但是,在 linux下面,sleep函數(shù)的參數(shù)是秒,而 windows

溫馨提示

  • 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

提交評論