2.21、2.22
一些概念:
進程控制是進程管理中最基本的功能。創(chuàng)建、終止、可負責進程運行中的狀態(tài)轉換。
進程控制一般是由OS的內核中的原語來實現的。
原語(Primitive)是由若干條指令組成的,用于完成一定功能的一個過程。
它與一般過程的區(qū)別在于:它們是“原子操作(Action Operation)”。即不可分割、不允許中斷、常駐內存。
•進程圖(Process Graph) 進程圖是用于描述一個進程的家族關系的有向樹。
2.2.3 進程的阻塞與喚醒
1. 引起進程阻塞和喚醒的事件
有下述幾類事件會引起進程阻塞或被喚醒。
•請求系統(tǒng)服務(如請求打印服務)
•啟動某種操作(如I/O操作)
•新數據尚未到達
•無新工作可做(某些特定功能的系統(tǒng)進程、如發(fā)送進程)
2.進程阻塞過程
無法繼續(xù)執(zhí)行,調用阻塞原語block把自己阻塞,是主動行為。
•立即停止執(zhí)行
•PCB中的現行狀態(tài)由“執(zhí)行”改為“阻塞” 并將PCB插入相應阻塞隊列
•轉調度程序進行重新調度,將處理機分配給另一就緒進程并進行切換
。ūA舯蛔枞M程的處理機狀態(tài)(在PCB中),再按新進程的PCB中的處理機狀態(tài)設置CPU的環(huán)境)。
3.進程喚醒過程
當被阻塞進程所期待的事件出現時,將等待該事件的進程喚醒。(如I/O完成)
喚醒原語執(zhí)行的過程是:
•把被阻塞的進程移出阻塞隊列
•將PCB中的現行狀態(tài)由阻塞改為就緒,然后再將該PCB插入到就緒隊列中。
應當指出,block原語和wakeup原語是一對作用剛好相反的原語。
故在某進程中調用了阻塞原語,則必須在與之相合作的另一進程中或其他相關的進程中安排喚醒原語,以能喚醒阻塞進程;
否則,其將長久地處于阻塞狀態(tài),從而再無機會繼續(xù)運行。
2.2.4 進程的掛起與激活
1.進程的掛起
當出現了引起進程掛起的事件時(比如,用戶進程請求將自己掛起,或父進程請求掛起某子進程)。
掛起原語suspend( )的執(zhí)行過程是:
•首先檢查被掛起進程的狀態(tài)并進行相應操作(執(zhí)行態(tài)、活動就緒 - 靜止就緒; 活動阻塞 - 靜止阻塞)。
•為便于用戶或父進程考查該進程的運行情況,把該進程的PCB復制到某指定的內存區(qū)域。
•最后,若被掛起的進程正在執(zhí)行,則轉向調度程序重新調度,從而將處理機重新分配。
2.進程的激活過程
當發(fā)生激活進程的事件時(如父進程或用戶進程請求激活指定進程)
激活原語active( )激活過程:
•激活原語將進程從外存調入內存
•檢查該進程的現行狀態(tài)并進行相應操作(靜止就緒-活動就緒; 靜止阻塞 - 活動阻塞)。
假如采用的是搶占調度策略,則每當有新進程進入就緒隊列時,
檢查是否要進行重新調度,即比較被激活進程與當前進程的優(yōu)先級,決定處理機歸屬。