




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、* 實踐教學實踐教學*蘭州理工大學蘭州理工大學計算機與通信學院2007 年秋季學期操作系統原理操作系統原理課程設計課程設計題 目: 信號機制實現 專業班級: 計通基地班 姓 名: 學 號: 指導教師: 成 績: _ 目目 錄錄摘摘 要要.3正正 文文.61. 設計思想.62. 算法用到的主要數據結構.83. 相關的各模塊的偽碼算法.94. 調試分析和測試結果.105. 源程序.11總總 結結.14參考文獻參考文獻.15致致 謝謝.153摘摘 要要操作系統被建立在用戶和系統硬件之間,接受用戶命令,從而組織硬件完成相應功能,以滿足用戶要求。進程是操作系統上程序的執行過程。程序通過進程得以執行。然而
2、,程序并不是孤立的,復雜的問題,可以使用不同程序去解決,即不同的進程去協作完成。由此產生了進程通信的概念。信號機制作為進程通信的一個基本方法,在進程通信中占有重要地位。雖然其機制有些陳舊,但在操作系統中仍然起著不可替代的作用,又被稱為軟中斷. 在本程序中,父進程創建兩個子進程,再用 kill()向兩個子進發出中斷信號,子進程 P1 和 P2 接到信號后,用 exit(0)函數正常終止自我進程(向父進程發SIGINT 信號) 。父進程的 wait()函數收到子進程的 SIGINT 信號后,對子進程作適當處理后(資源回收)后返回本進程。因為父進程有兩個子進程,所以需要兩個 wait()函數來等待子
3、進程的結束。 關關 鍵鍵 字字信號,軟中斷,父進程,子進程,stop(),waiting(),fork(),signal(),exit()4前前 言言1.1.信號的基本概念信號的基本概念 每個信號都對應一個正整數常量(稱為 signal number,即信號編號。定義在系統頭文件中),代表同一用戶的諸進程之間傳送事先約定的信息的類型,用于通知某進程發生了某異常事件。每個進程在運行時都要通過信號機制來檢查是否有信號到達。若有,便中斷正在執行的程序,轉向與該信號相對應的處理程序,以完成對該事件的處理;處理結束后再返回到原來的斷點繼續執行。實質上,信號機制是對中斷機制的一種模擬,故在早期的 UNIX
4、 版本中又把它稱為軟中斷。 信號與中斷的相似點:信號與中斷的相似點: (1)采用了相同的異步通信方式; (2)當檢測出有信號或中斷請求時,都暫停正在執行的程序而轉去執行相應的處理程序; (3)都在處理完畢后返回到原來的斷點;(4)對信號或中斷都可進行屏蔽。信號與中斷的區別:信號與中斷的區別: (1)中斷有優先級,而信號沒有優先級,所有的信號都是平等的; (2)信號處理程序是在用戶態下運行的,而中斷處理程序是在核心態下運行;(3)中斷響應是及時的,而信號響應通常都有較大的時間延遲。 信號機制具有以下三方面的功能:信號機制具有以下三方面的功能: (1)發送信號的程序用系統調用 kill( )實現;
5、 (2)接收信號的程序用 signal( )來實現對處理方式的預置; (3)收受信號的進程按事先的規定完成對相應事件的處理。 2 2信號的發送信號的發送 信號的發送,是指由發送進程把信號送到指定進程的信號域的某一位上。如果目標進程正在一個可被中斷的優先級上睡眠,核心便將它喚醒,發送進程就此結束。一個進程可能在其信號域中有多個位被置位,代表有多種類型的信號到達,但對于一類信號,進程卻只能記住其中的某一個。進程用 kill( )向一個進程或5一組進程發送一個信號。在本程序中,使用 16 SIGUSR1 用戶自定義信號 1 和 17 SIGUSR2 用戶自定義信號 2 分別向子進程 1、2 發送信號
6、。即 kill(p1,16)和kill(p2,17) 。3 3對信號的處理對信號的處理 當一個進程要進入或退出一個低優先級睡眠狀態時,或一個進程即將從核心態返回用戶態時,核心都要檢查該進程是否已收到軟中斷。當進程處于核心態時,即使收到軟中斷也不予理睬;只有當它返回到用戶態后,才處理軟中斷信號。對軟中斷信號的處理分三種情況進行: (1)如果進程收到的軟中斷是一個已決定要忽略的信號(function=1),進程不做任何處理便立即返回; (2)進程收到軟中斷后便退出(function=0);(3)執行用戶設置的軟中斷處理程序。6正正 文文1.1. 設計思想設計思想學生通過該題目的設計過程,可以掌握信
7、號的發送與接收的原理、軟件開發方法并提高解決實際問題的能力。使用系統調用 kill(),wait(),signal(),及 fork()編制一個通過信號完成進程通信,在接受信號后進程完成相應功能的程序。 (1)為了便于操作和觀察結果 ,用一個程序作為 “引子”,先后fork()兩個子進程 , 使用信號 ”SIGINT”進行通信。 (2)程序運行產生父進程使用signal()捕捉信號 Ctrl+C(即C) 然后用 kill()向子進程發送 SIGINT 并使用 wait()等待子進程結束,然后打印“parent killed“并退出。 (3)fork()建立兩個子進程 ,等待其父進程發來的消息。
8、當遇到SIGINT 信號時 ,則作為結束信號 , 子進程打印 :“child process1 killed by parent并結束退出。 涉及的系統調用:1. kill( )向指定進程發送信號。2. signal( ) 捕捉信號并在捕捉到相應信號后調用函數。3.wait( ) 中斷進程執行,等待子進程結束停止等待繼續進程的執行。4.fork( ) 創建進程的系統調用。2.2. 算法用到的主要數據結構(采用類算法用到的主要數據結構(采用類 c c 語言定義)語言定義)1、kill( )系統調用格式int kill(pid,sig)參數定義int pid,sig; 其中,pid 是一個或一組進
9、程的標識符,參數 sig 是要發送的軟中斷信號。 (1)pid0 時,核心將信號發送給進程 pid。 (2)pid=0 時,核心將信號發送給與發送進程同組的所有進程。7 (3)pid=-1 時,核心將信號像廣播般傳送給系統內所有進程。2、signal( )預置對信號的處理方式,允許調用進程控制軟中斷信號。系統調用格式signal(sig,function)頭文件為#include 參數定義signal(sig,function)int sig;void (*function) ( )函數說明:signal()會依參數 sig 指定的信號編號來設置該信號的處理函數。當指定信號到達時就會跳轉到參數
10、 function 指定的函數執行。如果參數function 不是函數指針,則必須是下列兩個常數之一:SIG_IGN 忽略參數 sig 指定的信號SIG_DFL 將參數 sig 指定的信號重設為核心預設的信號處理方式。其中 sig 用于指定信號的類型,sig 為 0 則表示沒有收到任何信號, 其中SIGINT(值是 02)表示中斷,當用戶從鍵盤按c 鍵或break 鍵時,則會產生此信號。function:該進程中的一個函數地址,在核心返回用戶態時,它以軟中斷信號的序號作為參數調用該函數,對除了信號 SIGKILL,SIGTRAP 和 SIGPWR 以外的信號,核心自動地重新設置軟中斷信號處理程
11、序的值為 SIG_DFL,一個進程不能捕獲 SIGKILL 信號。function 的解釋如下:(1)function=1 時,進程對 sig 類信號不予理睬,亦即屏蔽了該類信號;(2)function=0 時,缺省值,進程在收到 sig 信號后應終止自己;(3)function 為非 0,非 1 類整數時,function 的值即作為信號處理程序的指針。3、wait( ) 等待子進程運行結束。如果子進程沒有完成,父進程一直等待。wait( )將調用進程掛起,直至其子進程因暫?;蚪K止而發來軟中斷信號為止。如果在wait( )前已有子進程暫停或終止,則調用進程做適當處理后便返回。系統調用格式:i
12、nt wait(status)int *status; 其中,status 是用戶空間的地址。它的低 8 位反應子進程狀態,為 0 表8示子進程正常結束,非 0 則表示出現了各種各樣的問題;高 8 位則帶回了 exit( )的返回值。exit( )返回值由系統給出。核心對 wait( )作以下處理:(1)首先查找調用進程是否有子進程,若無,則返回出錯碼;(2)若找到一處于“僵死狀態”的子進程,則將子進程的執行時間加到父進程的執行時間上,并釋放子進程的進程表項;(3)若未找到處于“僵死狀態”的子進程,則調用進程便在可被中斷的優先級上睡眠,等待其子進程發來軟中斷信號時被喚醒。4、exit( )終止
13、進程的執行。系統調用格式: void exit(status) int status; 其中,status 是返回給父進程的一個整數,以備查考。為了及時回收進程所占用的資源并減少父進程的干預,UNIX/LINUX 利用 exit( )來實現進程的自我終止,通常父進程在創建子進程時,應在進程的末尾安排一條 exit( ),使子進程自我終止。exit(0)表示進程正常終止,exit(1)表示進程運行有錯,異常終止。 如果調用進程在執行 exit( )時,其父進程正在等待它的終止,則父進程可立即得到其返回的整數。核心須為 exit( )完成以下操作:(1)關閉軟中斷(2)回收資源(3)寫記帳信息(4
14、)置進程為“僵死狀態”5、lockf( )用作鎖定文件的某些段或整個文件。系統調用格式: int lockf(feles,function,size) int files,function; long size;其中,files 是文件描述符;function 是鎖定和解鎖,1 表示鎖定,0 表示解鎖;size 是鎖定和解鎖的字節數,若用 0,表示從文件的當前位置到文件尾。6、fork()函數用于創建一個新進程(子進程) 。其調用格式為: Int fork( );其中返回 int 取值意義如下:正確返回:等于 0,創建子進程,從子進程返回 ID 值。9錯誤返回:等于-1,創建失敗。3.3. 相
15、關的各模塊的偽碼算法相關的各模塊的偽碼算法1)創建子進程 1 和 2 并它們接受軟中斷信號main()int p1,p2;if(p1=fork() /*創建子進程 p1*/if(p2=fork() /*創建子進程 p2*/wait_mark=1;signal(SIGINT,stop); /*接收到c 信號,轉 stop*/waiting();kill(p1,02); /*向 p1 發軟中斷信號 02*/ kill(p2,02); /*向 p2 發軟中斷信號 02*/ wait(0); /*等待子進程 1 結束的信號*/wait(0); /*等待子進程 2 結束的信號*/printf(paren
16、t process is killed!n);exit(0); /*父進程結束*/elsewait_mark=1;signal(SIGINT,stop); /*等待進程 2 被殺死的中斷號 02*/waiting();lockf(1,0,0);printf(child process2 is killed by parent!n);lockf(1,0,0);10exit(0);elsewait_mark=1;signal(SIGINT,stop); /*等待進程 1 被殺死的中斷號 02*/waiting(); lockf(1,0,0);printf(child process1 is kil
17、led by parent!n);lockf(1,0,0);exit(0);2)定義 waiting()函數 void waiting() while(wait_matk!=0);3)定義 stop()函數 void stop( ) while(wait_mark=0);4.調試分析調試分析和測試結果和測試結果11父進程用系統調用 kill( )向兩個子進程發出信號,子進程捕捉到信號后分別輸出下列信息后終止:child process1 is killed by parent!child process2 is killed by parent! parent process is kille
18、d!5 5、源程序(帶注釋):、源程序(帶注釋):4. #include 5. #include 6. #include 7. #include 8. int waite; 9. void stop()10. 11. waite=0; 12. 13. static void waiting()14. 1215. while(waite=1); 16. 17. main()18. 19. int p1,p2; 20. while(p1=fork()=-1); /*創建子進程 p1*/21. if(p10)22. 23. printf(Child 1 is create !n); 24. whil
19、e(p2=fork()=-1); /*創建子進程 p2*/25. if(p20)26. 27. printf(Child 2 is create !n); 28. printf(Please press ctrl+Cn); 29. waite=1; 30. signal(SIGINT,stop); /*接收到c 信號轉 stop*/31. waiting(); 32. kill(p1,16); /*向 p1 發軟中斷信號 16*/33. kill(p2,17); /*向 p2 發軟中斷信號 17*/34. wait(0); /*同步*/35. wait(0); /*同步*/36. printf
20、(nParent process is killed !n); 1337. exit(0); 38. 39. else40. 41. waite=1; 42. signal(SIGINT,stop); 43. waiting(); 44. printf(nChild process2 is killed by parent !n); 45. exit(0); 46. 47. 48. else49. 50. waite=1; 51. signal(SIGINT,stop); 52. waiting(); 53. printf(nChild process1 is killed by parent !n); 54. exit(0); 55. 56. 14總總 結結課程設計是培養學生綜合運用所學知識,發現,提出,分析和解決實際問題,鍛煉實踐能力的重要環節,是對學生實際工作能力的具體訓練和考察過程.在這兩周的操作系統課程設計中, 我感受很深,使我明白只有徹底掌握知識才能把理論和知識牢固結合起來。由于以前沒有接觸過 UNIX/LINUX,也不知道如何使用 vi 編輯器,所以在調程序的時候翻閱了大量的資料。雖然很辛苦,但是可以學到很多很多的東西,同時不僅可以鞏固以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計我懂得了理論與實際相結合
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 開放社區食堂管理辦法
- 西安代理記賬管理辦法
- 遵義養豬日常管理辦法
- 大眾服裝陳列培訓課件
- 肝臟腫瘤護理課件
- 員工培訓理論課件
- 佛山春招數學試卷
- 二模高質量數學試卷
- 高三沖刺班高中數學試卷
- 肘關節脫位護理課件
- 2023-6新高考語文答題卡(全國甲卷兩欄)可以編輯
- 校本研修活動方案設計與實施
- 總承包管理技術方案
- 2024山西航空產業集團有限公司招聘筆試參考題庫附帶答案詳解
- 大學生心理健康教育(周莉第四版) 課件 第1-5章 主動掌控:打造健康生活-戀愛與性:理解親密關系
- 家庭教育學整套課件
- 營銷人員財務必備之財務與營銷結合
- 公安出入境培訓課件
- 領袖涅盤培訓
- 鍛壓設備安裝工程施工及驗收規范
- 瑞安市工業固廢與污泥無害化處置及資源化利用項目階段性竣工環境保護驗收報告
評論
0/150
提交評論