進程控制的基本過程:
????????????????進程的創建
????????????????進程的終止
????????????????進程的阻塞與喚醒
????????????????進程的掛起和激活
關于進程的親屬關系
????????系統中運行的進程并不都是孤立的,有的進程運行后,會調用其他進程來執行,這樣就組成了進程間的父子關系。
????????可用 “進程圖”描述一個進程的家族關系,該圖實際就是一種有向樹。
* 感受進程及進程樹
1.“運行”——輸入“cmd”,啟動命令行控制臺
2.在cmd窗口輸入“notepad”啟動記事本。
3.現在進程“cmd.exe”和進程“notepad.exe”就組成了一個進程樹,后者為子進程,前者為父進程。
4.用“任務管理器”在“進程”頁,右擊cmd.exe選擇“結束進程樹”。則記事本子進程也會結束。
????????一些木馬服務端程序運行后會同時生成兩個木馬進程,這兩個進程互相監控、互相保護。對此類木馬,我們就可以分別對兩個木馬進程嘗試使用“結束進程樹”命令。
進程間的父子關系關系著資源的繼承。創建和撤銷進程時,其父、子進程要相應的被影響。
1.進程的創建
1)一個進程創建另一進程的事件(原因)
????????????????用戶登錄:分時情況下用戶的請求
????????????????作業調度:批處理中
????????????????提供服務:運行中的用戶程序提出功能請求,要創建服務進程(如打印服務)
????????????????應用請求:應用程序自己創建進程,完成特定功能的新進程。(木馬程序)
2)創建過程(重點)
????????????????(1) 申請空白PCB
????????????????(2) 為新進程分配資源
????????????????????????????主要是內存資源的處理
????????????????(3) 初始化進程控制塊
????????????????????????????標識符(包括父進程的)、程序計數器指向程序入口地址,就緒態、優先級等信息的填寫。
????????????????(4) 將新進程插入就緒隊列
上述過程很關鍵,不能被打斷!!!
原語是由若干指令構成的原子操作過程,作為整體實現功能,不可被打斷。
????????????????OS通過調用進程創建原語Creat()創建新進程。
????????????????其他各控制工作也都是由OS內核以“原語”的方式實現,以保證不被打斷。
2.進程的終止
1)引起進程終止的事件
????????????正常結束
????????????異常結束
????????????????????內存越界錯誤
????????????????????保護錯(權限錯,如修改只讀文件等)
????????????????????非法指令(不存在的指令,程序異常轉向而把數據當指令)
????????????????????特權指令錯(用戶態程序試圖執行只有OS可執行的指令)
????????????????????運行超時、運算錯、i/o故障等
? ??????????外界干預
????????????????????操作員或操作系統干預(死鎖時,可人為結束)
????????????????????父進程請求終止子進程
????????????????????父進程終止,子孫進程也跟著終止
2)終止過程
對上述事件,OS調用內核終止原語,執行下列過程:
????????????????(1) 根據進程標示符,檢索出該進程PCB,讀其狀態。
????????????????????????????*IF 執行態,立即終止該進程,置調度標志為真,指示重新進行調度。
????????????????????????????*IF 有子孫進程,亦應予以終止,以防成為不可控進程。
????????????????(2) 歸還全部資源至其父進程或系統。
????????????????(3) 將該進程PCB從所在隊列或鏈表中移出。
3.進程的阻塞與喚醒
1)引起進程阻塞和喚醒的事件
????????????????請求系統服務的滿足情況
????????????????啟動某種需等待(I/O)操作
????????????????合作需要的新數據尚未到達
? ? ? ? ? ? ? ? 執行某功能的進程暫時無新工作可做(如發送數據進程)
2)阻塞和喚醒過程
由進程調用阻塞原語阻塞自己,是主動行為:
????????????????(1)將PCB中的狀態改為阻塞
????????????????(2)該PCB加入到阻塞隊列中
????????????????(3)轉進程調度,將處理機分配給另一進程
????????????????(4)進行進程切換,即根據兩切換進程的PCB,保護與重新設置處理機狀態。
阻塞與喚醒原語作用相反,成對使用
????????????阻塞進程等待的事件發生時,有關進程(如放棄該資源的進程)調用喚醒原語把等待該事件的進程喚醒。
????????????????????????(1)把阻塞進程從等待該事件的阻塞隊列中移出
????????????????????????(2)將其PCB中的現行狀態改為就緒
????????????????????????(3)將PCB插入到就緒隊列中。
4.進程的掛起與激活
掛起原語將指定進程或阻塞進程掛起。
????????????????(1)檢查被掛起進程的狀態,活動就緒則改為靜止就緒,活動阻塞則改為靜止阻塞
????????????????(2)將該PCB復制到內存(方便檢查)/外存(對換)指定區域
????????????????(3)*若掛起的進程是執行態,則需重新進行進程調度。
注意:進程只能掛起自己或其子孫進程。
? ??????激活原語的執行過程
????????????????????????????若掛起進程在外存上,將其調入內存
????????????????????????????檢查進程狀態,若處于靜止就緒,則改為活動就緒,若處于靜止阻塞,則改為活動阻塞
* 關于調度
????????????????進程控制中,狀態轉換和調度密切相關。
????????????????運行態進程的改變必然產生調度行為
????????????????只要產生新就緒態進程,就需考慮調度策略
????????????????????????????只要是采用搶占式調度,要檢查新就緒進程是否可搶占CPU,引起新的調度。
進程間有什么相互影響?
兩種制約關系:
? ? ? ? ? ? ? ? 1.間接相互制約關系:主要源于資源共享,表現為
????????????????????????????進程A---打印機資源---進程B(互斥)
????????????????2.直接相互制約關系:主要源于進程合作,表現為
????????????????????????????進程A寫緩沖---進程B讀緩沖(有序)
1.進程同步的基本概念
1)進程同步的主要任務:
????????????????使并發執行的諸進程之間能有效地共享資源和相互合作,從而使程序的執行具有可再現性。
2)臨界資源
一次僅允許一個進程使用的資源。
????????????????例1:兩個進程A、B,它們共享一個變量x,他們共同使x值增長。
????????????????所以對生產者和消費者而言,counter應作為臨界資源,應對其互斥訪問
????????????????若是一群生產者和消費者
? ??????生產者之間共同要影響的變量in要互斥;消費者間的out也一樣;
理解同步
3)臨界區
每個進程中訪問臨界資源的那段代碼叫臨界區。
為了正確同步,對臨界區的代碼要增加控制
進入區:對欲訪問的臨界資源進行檢。若此刻未被訪問,設正在訪問的標志
臨界區:訪問臨界資源的代碼。
退出區:將正在訪問的標志恢復為未被訪問的標志
剩余區:其余部分
4)同步機制應遵循的規則
實現互斥的方法應符合如下每條原則
????????????????空閑讓進:資源使用最基本原則
????????????????忙則等待:保證互斥
????????????????有限等待:合適時被喚醒防止死等
? ? ? ? ? ? ? ? 讓權等待:能主動釋放CPU防止忙等
同步控制的關鍵
主要涉及”判斷”和”修改標志”操作
????????????????不應被打斷(原語,OS核心態運行)
硬件同步機制
????????????????許多計算機提供一些特殊的硬件指令,允許對一個字中的內容進行檢測和修正,或對兩個字的內容進行交換。利用這些特殊指令解決臨界區問題。
????????????????進入臨界區往往跟其標志有關,可將標志看做一個鎖,“鎖開”進入并關鎖,“鎖關”必須等待,初始時鎖是打開的。
①關中斷
????????????進入鎖測試前關閉中斷,直到完成鎖測試并上鎖后才能打開中斷。進程在臨界區執行期間,系統不響應中斷,從而不引發調度。
缺點:
????????????????濫用風險
????????????????關中斷時間過長會影響效率,限制CPU交叉執行能力
????????????????不適用于多CPU系統
②Test-and-Set指令
③利用Swap指令實現進程互斥
????????????????完全利用軟件方法,有很大局限性,也不適于多進程,現在已很少采用。
????????????????硬件指令機械操作可保證鎖開、關操作不被打斷;適用于任意數目的進程。但等待要耗費CPU時間,不能實現“讓權等待”,從等待進程中隨機選擇一個進入臨界區,有的進程可能一直選不上,難以實現較為復雜的進程同步問題。
2.信號量機制
荷蘭科學家Dijkstra(狄克斯特拉)提出的一種卓有成效的進程同步機制。
1) 整型信號量
最初的信號量機制,兩個原子操作對一個共享整型量進行操作。
????????????????信號量定義為一個整型量;
????????????????根據初始情況賦相應的值;
????????????????僅能通過兩個原子操作來訪問。