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

