實驗3進程通信signal軟中斷201610_第1頁
實驗3進程通信signal軟中斷201610_第2頁
實驗3進程通信signal軟中斷201610_第3頁
實驗3進程通信signal軟中斷201610_第4頁
實驗3進程通信signal軟中斷201610_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第四章 進程管理實驗4.1 實驗?zāi)康?一、加深對進程概念的理解,明確進程和程序的區(qū)別 二進一步認(rèn)識并發(fā)執(zhí)行的實質(zhì) 三分析進程爭用資源的現(xiàn)象,學(xué)習(xí)解決進程互斥的方法 四了解Linux系統(tǒng)中進程通信的基本原理 4.2 準(zhǔn)備知識 4.2.1 基本概念 進程的概念 進程與程序的區(qū)別 并發(fā)執(zhí)行的概念 進程互斥的概念 進程通信的基本原理 2系統(tǒng)調(diào)用圖4-1 系統(tǒng)調(diào)用的參數(shù)表方式變元表: N 參數(shù)1 參數(shù)2 參數(shù)n (a) 直接方式 trap 參數(shù)1 參數(shù)2 參數(shù)n 變元表: N 指針 (b) 間接方式 系統(tǒng)調(diào)用是一種進入系統(tǒng)空間的辦法。通常,在OS的核心中都設(shè)置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,并將它

2、們提供給程序員使用。程序員在需要OS提供某種服務(wù)的時候,便可以調(diào)用一條系統(tǒng)調(diào)用命令,去實現(xiàn)希望的功能,這就是系統(tǒng)調(diào)用。因此,系統(tǒng)調(diào)用就像一個黑箱子一樣,對用戶屏蔽了操作系統(tǒng)的具體動作而只是提供了調(diào)用功能的接口。系統(tǒng)調(diào)用與一般的過程調(diào)用有下述幾方面的明顯差別:(1)運行在不同的系統(tǒng)狀態(tài)。(2)通過軟中斷進入。 (3)返回問題。當(dāng)調(diào)用進程仍具有最高優(yōu)先級時,才返回到調(diào)用進程繼續(xù)執(zhí)行;否則,將引起重新調(diào)度,以便讓優(yōu)先權(quán)最高的進程優(yōu)先執(zhí)行。 (4)嵌套調(diào)用。系統(tǒng)調(diào)用也可以嵌套進行 系統(tǒng)調(diào)用的實現(xiàn)系統(tǒng)調(diào)用的實現(xiàn)與一般過程調(diào)用的實現(xiàn)相比,兩者間有很大差異。對于系統(tǒng)調(diào)用,控制是由原來的用戶態(tài)轉(zhuǎn)換為系統(tǒng)態(tài),這

3、是借助于中斷和陷入機制來完成的,在該機制中包括中斷和陷入硬件機構(gòu)及中斷與陷入處理程序兩部分。 是指CPU對系統(tǒng)發(fā)生某事件時的一種響應(yīng).(1)是指由于外部設(shè)備事件所引起的中斷.(2)則是指由于CPU內(nèi)部事件所引起的中斷. 如程序出錯(地址越界)、電源故障等。內(nèi)中斷(trap)被譯為“捕獲”或“陷入”。 是由于執(zhí)行了現(xiàn)行指令所引起的;則是由于系統(tǒng)中某事件引起的,該事件與現(xiàn)行指令無關(guān)。 進程創(chuàng)建與軟中斷通信forkfork系統(tǒng)調(diào)用系統(tǒng)調(diào)用:由于進程為執(zhí)行程序的環(huán)境,因此在執(zhí)行程序前必須先建立這個能跑程序的環(huán)境。Linux系統(tǒng)提供系統(tǒng)調(diào)用拷貝現(xiàn)行進程的內(nèi)容,以產(chǎn)生新的進程,調(diào)用fork的進程稱為父進程

4、;而所產(chǎn)生的新進程則稱為子進程。子進程會承襲父進程的一切特性,但是它有自己的數(shù)據(jù)段,也就是說,盡管子進程改變了所屬的變量,卻不會影響到父進程的變量值。 父進程和子進程共享一個程序段共享一個程序段,但是各自擁有自己的堆棧、數(shù)據(jù)段、用戶空間以及進程控制塊。換言之,兩個進程執(zhí)行的程序代碼是一樣的,但是各有各的程序計數(shù)器與自己的私人數(shù)據(jù)。 9linux 是多用戶和多進程的操作系統(tǒng),進程在操作系統(tǒng)中的創(chuàng)建,都會生成一個進程描述塊,描述當(dāng)前進程的所有信息,包括,數(shù)據(jù)段、代碼段、堆棧段的地址,當(dāng)前進程的環(huán)境變量,文件描述符等。fork函數(shù)過程:操作系統(tǒng)先創(chuàng)建一個進程描述塊,然后把父進程的所有進程描述符的信息

5、精確拷貝過來,和父進程一樣(除了進程ID不一樣外),代碼段共享,數(shù)據(jù)段和堆棧段復(fù)制,所有的寄存器的值全部精確拷貝,文件描述符也許精確拷貝。forkfork的返回值的返回值,fork在父進程父進程空間中返回子進程的PIDPID,在子進程子進程空間中返回0 0。10圖3-2 父進程和子進程的內(nèi)存映像用戶內(nèi)存區(qū) 父進程的vm_arce_struct vm start vm start count = 2 vm start vm start count = 2 子進程的vm_arce_struct 子進程數(shù)據(jù)區(qū) 子進程堆棧區(qū) 父進程數(shù)據(jù)區(qū) 父進程堆棧區(qū) 共享正文區(qū) 11一fork()函數(shù):用于創(chuàng)建一個

6、新進程(子進程)int fork(); pid = fork(); if(pid 0) printf(The parent process is running now!n); exit(0); 進程創(chuàng)建與軟中斷通信信號與軟中斷信號是OS系統(tǒng)中使用的一種進程間通信方式,它提供一種處理異步事件的方法。例如:用戶可以通過一個中斷指令中斷一個程序的執(zhí)行,兩個進程間可以通過發(fā)送信號通知一個異步事件,系統(tǒng)或進程通過信號報告突發(fā)的硬件故障(如非法指令或運算溢出)。此外,系統(tǒng)還可以通過信號實現(xiàn)軟中斷,即用戶進程向自身發(fā)送信號,以調(diào)用某些系統(tǒng)功能,或轉(zhuǎn)入某些特定處理。進程創(chuàng)建與軟中斷通信“軟中斷”不同于普通中

7、斷,它是指通過隨機向進程發(fā)送信號,通知進程完成某事件。只有執(zhí)行狀態(tài)的進程才會響應(yīng)該信號,與處理普通中斷一樣,進程轉(zhuǎn)而執(zhí)行信號要求的處理。如果信號到達時,進程處于執(zhí)行狀態(tài)以外的其他狀態(tài),則信號不會被響應(yīng)。進程創(chuàng)建與軟中斷通信系統(tǒng)調(diào)用signal( sig, function)是進程用來設(shè)定某個信號的處理方法;系統(tǒng)調(diào)用kill(Pid, Iid)是用來發(fā)送信號給指定進程的。這 兩個調(diào)用可以形成信號的基本操作。處理信號有三種類型:進程接收到信號后退 出;進程忽略該信號;進程收到信號后執(zhí)行用戶設(shè)定用系統(tǒng)調(diào)用signal的函數(shù)。1.信號SIGINT由按下Ctrl-C發(fā)出,信號SIGQUIT由按下Ctrl

8、-發(fā)出。信號信號功能功能值值SIGHUPSIGHUP掛起掛起1 1SIGINTSIGINT鍵盤中斷,鍵盤按鍵盤中斷,鍵盤按DeleteDelete鍵或鍵或BreakBreak鍵鍵2 2SIGQUITSIGQUIT鍵盤按鍵盤按QuitQuit鍵鍵3 3SIGILLSIGILL非法指令非法指令4 4SIGTRAPSIGTRAP跟蹤中斷跟蹤中斷5 5SIGIOTSIGIOTIOTIOT指令指令6 6SIGBUSSIGBUS總線錯總線錯7 7SIGFPESIGFPE浮點運算溢出浮點運算溢出8 8SIGKILLSIGKILL要求終止進程要求終止進程9 9SIGUSR1SIGUSR1用戶定義信號用戶定義信

9、號#1#11010SIGSEGVSIGSEGV段違法段違法1111SIGUSR2SIGUSR2用戶定義信號用戶定義信號#2#21212SIGPIPESIGPIPE向沒有讀進程的管道上寫向沒有讀進程的管道上寫1313SIGALRMSIGALRM定時器告警,時間到定時器告警,時間到1414SIGTERMSIGTERMkillkill發(fā)出的軟件結(jié)束信號發(fā)出的軟件結(jié)束信號15 (16,15 (16,堆棧錯誤,使進程終止堆棧錯誤,使進程終止) )SIGCHLDSIGCHLD子進程死子進程死1717SIGCONTSIGCONT若已停止則繼續(xù)若已停止則繼續(xù)1818SIGPWRSIGPWR電源故障電源故障30

10、30Wait()Wait()函數(shù)函數(shù)Wait()函數(shù)常用來控制父進程與子進程的同步。在父進程中調(diào)用wait()函數(shù),則父進程被阻塞,進入等待隊列,等待子進程結(jié)束。當(dāng)子進程結(jié)束時,會向父進程發(fā)出SIGCHLD信號。當(dāng)接收到信號后,父進程從wait()函數(shù)返回繼續(xù)執(zhí)行原程序。Exit()Exit()函數(shù)函數(shù)是進程結(jié)束最常調(diào)用的函數(shù)。在正常終止時,exit()函數(shù)返回進程結(jié)束狀態(tài)。進程創(chuàng)建與軟中斷通信#include #include #include #include int wait_flag;void stop() wait_flag=0; wait_flag=0; ;main() int p

11、id1,pid2;wait_flag=1;signal(2,stop); /or signal(14,stop);進程創(chuàng)建與軟中斷通信 while(wait_flag=1); while(wait_flag=1);while(pid1=fork()=-1);while(pid1=fork()=-1);if(pid10) if(pid10) while(pid2=fork()=-1); while(pid2=fork()=-1); if(pid20) if(pid20) wait_flag=1; wait_flag=1; sleep(5); sleep(5); kill(pid1,16); ki

12、ll(pid1,16); kill(pid2,17); kill(pid2,17); wait(0); wait(0); wait(0); wait(0); printf( printf(ParentParent process is killed !n); process is killed !n); exit(0); exit(0); else else wait_flag=1; wait_flag=1; signal(17,stop); signal(17,stop); while(wait_flag=1); while(wait_flag=1); printf(Child printf

13、(Child process 2 process 2 is killed by parent !n);is killed by parent !n); exit(0); exit(0); else else wait_flag=1; wait_flag=1; signal(16,stop); signal(16,stop); while(wait_flag=1); while(wait_flag=1); printf(Child printf(Child process 1 process 1 is killed by parent !n);is killed by parent !n); exit(0); exit(0); 進程創(chuàng)建與軟中斷通信else wait_flag=1; signal(17,stop); while(wait_

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論