二、進程管理
1.程序、進程和處理器
程序是指令的集合,每一程序完成確定的任務。在只允許一個程序運行的系統(tǒng)(稱為單道系統(tǒng))中,這個程序獨占系統(tǒng)資源,而系統(tǒng)按程序的指令順序運行,程序的順序執(zhí)行有兩個基本特征,即程序的封閉性和程序的可再現(xiàn)性。封閉性是指程序運行時獨占系統(tǒng)資源,只有程序本身能改變系統(tǒng)的狀態(tài);可再現(xiàn)性是指程序運行不受外部因素影響,只要初始條件相同,運行結果就相同。多道程序系統(tǒng)讓多個程序在系統(tǒng)中輪流運行,當一個程序不用處理器時,另一個程序就使用。也就是說,處理器在程序間切換,從而獲得宏觀上的并行(微觀上的串行),以提高處理器的利用率。這種切換,通常是由中斷引起的。由于中斷是以不可預測的次序發(fā)生,即程序的指令序列也以不可預測的次序前進,這樣就會產(chǎn)生操作系統(tǒng)的另一特性:不確定性。即在多道程序系統(tǒng)中,順序程序的封閉性和可再現(xiàn)性消失了。需要采用一個新的概念———進程來描述程序的執(zhí)行,進程是運行中的程序。
2.進程間的通信
在操作系統(tǒng)中,進程是可以獨立運行的程序單位,系統(tǒng)中的各個進程并不是相互隔離的:一方面它們相互競爭使用有限的資源,如處理器、存儲器、設備或文件等;另一方面,它們可能相互協(xié)作以達到用戶作業(yè)預期的目的。因此,進程之間需要某種形式的通信。進程之間直接發(fā)生聯(lián)系的稱為相交進程(又稱相關進程),否則為不相交進程。相交進程需要協(xié)調(diào)彼此間的相對運行速度,存在著直接制約的關系。不相交進程之間的聯(lián)系將表現(xiàn)在資源使用上的間接制約關系。
(1)互斥多道系統(tǒng)中,各進程可以共享各類資源,但有些資源卻一次只能供一個進程使用。這種資源常常稱為臨界資源,如打印機、公共變量、表格等?;コ馐且?*臨界資源在某一時刻只被一個進程訪問。
(2)同步一般一個進程相對于另一個進程的速度是不可預測的,也就是說,進程之間是異步運行的。為了成功地協(xié)同工作,有關進程在某些確定的點上應當同步它們的活動:一個進程到達了這些點后,除非另一進程已完成了某個活動,否則就停下來,以等待該活動結束。
(3)死鎖當若干進程競爭使用資源時,可能產(chǎn)生下述情況:每個進程要求的資源都已被另一進程占用,于是也就沒有一個進程能繼續(xù)運行。這種情況稱為死鎖。
3.信號量與P,V操作
用順序程序設計技術處理同步與互斥是十分困難的,為此引入信號量概念:信號量是一種特殊的變量,它的表現(xiàn)形式是一個整型變量及相應的隊列:除了設置初值外,對信號量只能施加特殊的操作:P操作和V操作,P操作和V操作都是不可分割的原子運行,也稱為原語(有時分別記為down()和up()或wait()和signal())。P操作的作用是將信號量S的值減1,若S的值成負數(shù),則調(diào)用P操作的進程暫停執(zhí)行,直到另一個進程對同一信號量作V操作。V操作的作用是將信號量S的值加1,若S的值小于等于0,從相應隊列(關于S的隊列)中選一個進程,喚醒它。
(1)互斥為了保護共享資源(如公共變量等),使它們不被多個進程同時訪問,就要阻止這些進程同時執(zhí)行訪問這些資源的代碼段,這些代碼段稱為臨界區(qū),這些資源稱為臨界資源。對臨界資源訪問的互斥要求可視作執(zhí)行臨界區(qū)的互斥要求。利用信號量可以方便地實現(xiàn)互斥臨界區(qū)的管理要求。例如,令信號量mutex的初值為1,于是臨界區(qū)就改寫成下列形式的代碼段。P(mutex);臨界區(qū)V(mutex);由于mutex初值為1,P、V是原子操作,確實可以實現(xiàn)互斥。
(2)同步最簡單的同步形式是:進程A在另一個進程B已到達點L2以前,不應前進到超過點L1。對此,可以令信號量proceed初值為0,實現(xiàn)這種同步的程序形式是: 進程A L1:P(proceed); … …進程B L2:V(proceed); … …更復雜一點的同步問題是單緩沖的生產(chǎn)者、消費者問題。
4.高級通信原語
P、V操作是用來協(xié)調(diào)進程間關系的,編程較困難而且沒有信息交換,故常稱為低級通信原語。此外,P、V操作必須有共享存儲器,而高級通信原語則提供兩種通信方式:有緩沖區(qū)的通信和無緩沖區(qū)的通信。
(1)有緩沖區(qū)的通信方式中,有原語:
Write(Buffer_Name,Variable) 等緩沖區(qū)空再存入
Read(Buffer_Name,Variable) 等緩沖區(qū)滿再取出
(2)無緩沖區(qū)的通信,又稱為消息傳遞,有原語:
Send(Who,Message) 發(fā)送消息給指定進程或一組進程
Receive(Who,Message) 從約定進程接收消息有的系統(tǒng)還提供帶標記的發(fā)送,有Send(Who,Message,Tag)用Tag可指定發(fā)送進程是否要等待接收進程取到內(nèi)容以后再繼續(xù)運行。一般接收者總是要等待消息到達后才繼續(xù)運行。