詳細資料
THE是艾恩德霍芬技術大學的荷蘭文TchnischeHoogeschoolEindhov–en的詞頭縮寫。狄克斯特拉在THE這個系統中所提出的一系統方法和技術奠定了計算機現代操作系統的基礎,尤其是關于多層體系結構,順序進程之間的同步和互斥機制這樣一些重要的思想和概念都是狄克斯特拉在THE中首先提出并為以後的操作系統如UNⅨ等所采用的。
為了在單處理機的情況下确定進程(process)能否占有處理機,狄克斯特拉将每個進程分為“就緒”(ready)、“運行”(running)和“阻塞”(blocking)三個工作狀态。由于在任一時刻最多隻有一個進程可以使用處理機,正占用着處理機的進程稱為“運行”進程。當某進程已具備了使用處理機的條件,而當前又沒有處理機供其使用,則使該進程處于“就緒”狀态。當運行進程由于某種原因無法繼續運行下去時,就停止其占用處理機,使之進入“阻塞”狀态,待造成其退出運行的條件解除,再進入“就緒”狀态。
而對系統中所有同時運行的進程之間所存在的相互制約的同步(synchronization,指為了避免錯誤,在一個進程訪問共享數據時,另一個進程不訪問該數據)和互斥(mutually-exclusive,指兩個進程不能同時在一個臨界區中使用同一個可重複使用的資源,諸如讀寫緩沖區)兩個關系,狄克斯特拉巧妙地利用火車運行控制系統中的“信号燈”(semaphore,或叫“信号量”)概念加以解決。
所謂信号燈,實際上就是用來控制進程狀态的一個代表某一資源的存儲單元。例如,P1和P2是分别将數據送入緩沖B和從緩沖B讀出數據的兩個進程,為了防止這兩個進程并發時産生錯誤,狄克斯特拉設計了一種同步機制叫“PV操作”,P操作和V操作是執行時不被打斷的兩個操作系統原語。執行P操作P(S)時信号量S的值減1,若結果不為負則P(S)執行完畢,否則執行P操作的進程暫停以等待釋放。執行V操作V(S)時,S的值加1,若結果不大于0則釋放一個因執行P(S)而等待的進程。對P1和P2可定義兩個信号量S1和S2,初值分别為1和0。
進程P1在向緩沖B送入數據前執行P操作P(S1),在送入數據後執行V操作V(S2)。進程P2在從緩沖B讀取數據前先執行P操作P(S2),在讀出數據後執行V操作V(S1)。當P1往緩沖B送入一數據後信号量S1之值變為0,在該數據讀出後S1之值才又變為1,因此在前一數未讀出前後一數不會送入,從而保證了P1和P2之間的同步。
中國讀者常常不明白這一同步機制為什麼叫PV操作,原來這是狄克斯特拉用荷蘭文定義的,因為在荷蘭文中,通過叫passeren,釋放叫vrijgeven,PV操作因此得名。這是在計算機術語中不是用英語表達的極少數的例子之一。
解釋
1962年,狄克斯特拉離開數學中心進入位于荷蘭南部的艾恩德霍芬技術大學(EindhovenTechnicalUniversity)任數學教授。在這裡,他參加了X8計算機的開發,設計與實現了具有多道程序運行能力的操作系統——THEMultiprogrammingSystem。
THE是艾恩德霍芬技術大學的荷蘭文TchnischeHoogeschoolEindhov–en的詞頭縮寫。狄克斯特拉在THE這個系統中所提出的一系統方法和技術奠定了計算機現代操作系統的基礎,尤其是關于多層體系結構,順序進程之間的同步和互斥機制這樣一些重要的思想和概念都是狄克斯特拉在THE中首先提出并為以後的操作系統如UNⅨ等所采用的。為了在單處理機的情況下确定進程(process)能否占有處理機,狄克斯特拉将每個進程分為“就緒”(ready)、“運行”(running)和“阻塞”(blocking)三個工作狀态。由于在任一時刻最多隻有一個進程可以使用處理機,正占用着處理機的進程稱為“運行”進程。
當某進程已具備了使用處理機的條件,而當前又沒有處理機供其使用,則使該進程處于“就緒”狀态。當運行進程由于某種原因無法繼續運行下去時,就停止其占用處理機,使之進入“阻塞”狀态,待造成其退出運行的條件解除,再進入“就緒”狀态。而對系統中所有同時運行的進程之間所存在的相互制約的同步(synchronization,指為了避免錯誤,在一個進程訪問共享數據時,另一個進程不訪問該數據)和互斥(mutually-exclusive,指兩個進程不能同時在一個臨界區中使用同一個可重複使用的資源,諸如讀寫緩沖區)兩個關系,狄克斯特拉巧妙地利用火車運行控制系統中的“信燈”(semaphore,或叫“信号量”)概念加以解決。
所謂信号燈,實際上就是用來控制進程狀态的一個代表某一資源的存儲單元。例如,P1和P2是分别将數據送入緩沖B和從緩沖B讀出數據的兩個進程,為了防止這兩個進程并發時産生錯誤,狄克斯特拉設計了一種同步機制叫“PV操作”,P操作和V操作是執行時不被打斷的兩個操作系統原語。
執行P操作P(S)時信号量S的值減1,若結果大于等于0,則P(S)執行完畢,否則執行P操作的進程暫停以等待釋放。執行V操作V(S)時,S的值加1,若結果不大于0,則釋放一個因執行P(S)而等待的進程。對P1和P2可定義兩個信号量S1和S2,初值分别為1和0。進程P1在向緩沖B送入數據前執行P操作P(S1),在送入數據後執行V操作V(S2)。進程P2在從緩沖B讀取數據前先執行P操作P(S2),在讀出數據後執行V操作V(S1)。當P1往緩沖B送入一數據後信号量S1之值變為0,在該數據讀出後S1之值才又變為1,因此在前一數未讀出前後一數不會送入,從而保證了P1和P2之間的同步。
信号量是最早出現的用來解決進程同步與互斥問題的機制,
包括一個稱為信号量的變量及對它進行的兩個原語操作。
信号量的概念
1.信号量的類型定義
信号量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信号量的下一個進程。信号量的值與相應資源的使用情況有關。當它的值大于0時,表示當前可用資源的數量;當它的值小于0時,其絕對值表示等待使用該資源的進程個數。注意,信号量的值僅能由PV操作來改變。
一般來說,信号量S>=0時,S表示可用資源的數量。執行一次P操作意味着請求分配一個單位資源,因此S的值減1;當S<0時,表示已經沒有可用資源,請求者必須等待别的進程釋放該類資源,它才能運行下去。而執行一個V操作意味着釋放一個單位資源,因此S的值加1;若S<0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀态的進程,使之運行下去。
2.PV原語
PV操作是典型的同步機制之一。用一個信号量與一個消息聯系起來,當信号量的值為0時,表示期望的消息尚未産生;當信号量的值非0時,表示期望的消息已經存在。用PV操作實現進程同步時,調用P操作測試消息是否到達,調用V操作發送消息。
對一個信号量變量可以進行兩種原語操作:p操作和v操作,定義如下:procedurep(vars:samephore);
{
s.value=s.value-1;
if(s.value<0)asleep(s.queue);
}
procedurev(vars:samephore);
{
s.value=s.value+1;
if(s.value<=0)wakeup(s.queue);
}
其中用到兩個标準過程:
asleep(s.queue);執行此操作的進程的PCB進入s.queue尾部,進程變成等待狀态
wakeup(s.queue);将s.queue頭進程喚醒插入就緒隊列
s.value初值為1時,可以用來實現進程的互斥。
p操作和v操作是不可中斷的程序段,稱為原語。如果将信号量看作共享變量,則pv操作為其臨界區,多個進程不能同時執行,一般用硬件方法保證。一個信号量隻能置一次初值,以後隻能對之進行p操作或v操作。
由此也可以看到,信号量機制必須有公共内存,不能用于分布式操作系統,這是它最大的弱點。
V原語的主要操作是:
⑴sem加1;
⑵若相加結果大于零,則進程繼續執行;
⑶若相加結果小于或等于零,則喚醒一阻塞在該信号量上的進程,然後再返回原進程繼續執行或轉進程調度。
進程P1進程P2……進程Pn
………………
P(S);P(S);P(S);
臨界區;臨界區;臨界區;
V(S);V(S);V(S);
……………………
其中信号量S用于互斥,初值為1。
使用PV操作實現進程互斥時應該注意的是:
⑴每個程序中用戶實現互斥的P、V操作必須成對出現,先做P操作,進臨界區,後做V操作,出臨界區。若有多個分支,要認真檢查其成對性。
⑵P、V操作應分别緊靠臨界區的頭尾部,臨界區的代碼應盡可能短,不能有死循環。
⑶互斥信号量的初值一般為1。
利用信号量和PV操作實現進程同步:
PV操作是典型的同步機制之一。用一個信号量與一個消息聯系起來,當信号量的值為0時,表示期望的消息尚未産生;當信号量的值非0時,表示期望的消息已經存在。用PV操作實現進程同步時,調用P操作測試消息是否到達,調用V操作發送消息。
⑴分析進程間的制約關系,确定信号量種類。在保持進程間有正确的同步關系情況下,哪個進程先執行,哪些進程後執行,彼此間通過什麼資源(信号量)進行協調,從而明确要設置哪些信号量。
⑵信号量的初值與相應資源的數量有關,也與P、V操作在程序代碼中出現的位置有關。
⑶同一信号量的P、V操作要成對出現,但它們分别在不同的進程代碼中。
典型理解偏差
三個問題:
一,以V原語的1、2步來做,Sem不就永遠大于0,那進程不就一直循環執行成為死循環了?
二,Sem大于0那就表示有臨界資源可供使用,為什麼不喚醒進程?
三,Sem小于0應該是說沒有臨界資源可供使用,為什麼還要喚醒進程?
析疑:
一,P操作對sem減1的。P、V原語必須成對使用!從而不會造成死循環。
二,Sem大于0的确表示有臨界資源可供使用,而且這個時候沒有進程被阻塞在這個資源上,也就是說沒有進程因為得不到這類資源而阻塞,所以沒有被阻塞的進程,自然不需要喚醒。
三,V原語操作的本質在于:一個進程使用完臨界資源後,釋放臨界資源,使Sem加1,以通知其它的進程,這個時候如果Sem<0,表明有進程阻塞在該類資源上,因此要從阻塞隊列裡喚醒一個進程來“轉手”該類資源。比如,有兩個某類資源,四個進程A、B、C、D要用該類資源,最開始Sem=2,當A進入,Sem=1,當B進入Sem=0,表明該類資源剛好用完,當C進入時Sem=-1,表明有一個進程被阻塞了,D進入,Sem=-2。當A用完該類資源時,進行V操作,Sem=-1,釋放該類資源,而這時Sem<0,表明有進程阻塞在該類資源上,于是喚醒一個。
為了進一步加深理解,再引入二個問題:
四,如果是互斥信号量的話,應該設置信号量Sem=1,但是當有5個進程都訪問的話,最後在該信号量的鍊表裡會有4個在等待,也是說S=-4,那麼第一個進程執行了V操作使S加1,釋放了資源,下一個應該能夠執行,但喚醒的這個進程在執行P操作時因S〈0,也還是執行不了,這是怎麼回事呢?
五,Sem的絕對值表示等待的進程數,同時又表示臨界資源,這到底是怎麼回事?
析疑:
四,當一個進程阻塞了的時候,它已經執行過了P操作,并卡在臨界區那個地方。當喚醒它時就立即進入它自己的臨界區,并不需要執行P操作了,當執行完了臨界區的程序後,就執行V操作。
五,當信号量Sem小于0時,其絕對值表示系統中因請求該類資源而被阻塞的進程數目.S大于0時表示可用的臨界資源數。注意在不同情況下所表達的含義不一樣。當等于0時,表示剛好用完。



















