1. 程式人生 > >作業系統第二章第二節

作業系統第二章第二節

程序控制

程序控制的基本過程: 程序的建立 程序的終止 程序的阻塞與喚醒 程序的掛起和啟用

關於程序的親屬關係: 系統中執行的程序並不都是孤立的,有的程序執行後,會呼叫其他程序來執行,這樣就組成了程序間的父子關係。 可用 “程序圖”描述一個程序的家族關係,該圖實際就是一種有向樹。 程序間的父子關係關係著資源的繼承。建立和撤銷程序時,其父、子程序要相應的被影響。

1.程序的建立 (1)一個程序建立另一程序的事件(原因) 使用者登入:分時情況下使用者的請求 作業排程:批處理中 提供服務:執行中的使用者程式提出功能請求,要建立服務程序(如列印服務) 應用請求:應用程式自己建立程序,完成特定功能的新程序。(木馬程式) (2)建立過程(很關鍵,不能被打斷) - 申請空白PCB -為新程序分配資源:主要是記憶體資源的處理 - 初始化程序控制塊:識別符號(包括父程序的)、程式計數器指向程式入口地址,就緒態、優先順序等資訊的填寫。 -將新程序插入就緒佇列

2.程序的終止 (1)引起程序終止的事件 -正常結束 -異常結束: 記憶體越界錯誤 保護錯(許可權錯,如修改只讀檔案等) 非法指令(不存在的指令,程式異常轉向而把資料當指令) 特權指令錯(使用者態程式試圖執行只有OS可執行的指令) 執行超時、運算錯、i/o故障等 -外界干預 操作員或作業系統干預(死鎖時,可人為結束) 父程序請求終止子程序 父程序終止,子孫程序也跟著終止 (2)終止過程 對上述事件,OS呼叫核心終止原語,執行下列過程: - 根據程序標示符,檢索出該程序PCB,讀其狀態。 *IF 執行態,立即終止該程序,置排程標誌為真,指示重新進行排程。 *IF 有子孫程序,亦應予以終止,以防成為不可控程序。 -歸還全部資源至其父程序或系統。 -將該程序PCB從所在佇列或連結串列中移出

3.程序的阻塞與喚醒 (1).引起程序阻塞和喚醒的事件 請求系統服務的滿足情況 啟動某種需等待(I/O)操作 合作需要的新資料尚未到達 執行某功能的程序暫時無新工作可做(如傳送資料程序) (2).阻塞和喚醒過程 由程序呼叫阻塞原語阻塞自己,是主動行為: -將PCB中的狀態改為阻塞 -該PCB加入到阻塞佇列中 -轉程序排程,將處理機分配給另一程序 -進行程序切換,即根據兩切換程序的PCB,保護與重新設定處理機狀態。 阻塞與喚醒原語作用相反,成對使用 阻塞程序等待的事件發生時,有關程序(如放棄該資源的程序)呼叫喚醒原語把等待該事件的程序喚醒。 -把阻塞程序從等待該事件的阻塞佇列中移出 -將其PCB中的現行狀態改為就緒 -將PCB插入到就緒佇列中。

4.程序的掛起與啟用 程序的狀態,活動就緒則改為靜止就緒,活動阻塞則改為靜止阻塞 掛起原語將指定程序或阻塞程序掛起。 (1)檢查被掛起程序的狀態,活動就緒則改為靜止就緒,活動阻塞則改為靜止阻塞 (2)將該PCB複製到記憶體(方便檢查)/外存(對換)指定區域 (3)*若掛起的程序是執行態,則需重新進行程序排程。 注意:程序只能掛起自己或其子孫程序 啟用原語的執行過程: -若掛起程序在外存上,將其調入記憶體 -檢查程序狀態,若處於靜止就緒,則改為活動就緒,若處於靜止阻塞,則改為活動阻塞 關於排程: -程序控制中,狀態轉換和排程密切相關。 -執行態程序的改變必然產生排程行為 -只要產生新就緒態程序,就需考慮排程策略 只要是採用搶佔式排程,要檢查新就緒程序是否可搶佔CPU,引起新的排程