最近在準備軟考的時候看到關于PV操作的相關指示點,這里就做個記錄,希望對大家有一定的幫助。最開始我很好奇這個PV名字來源,問了好多大佬都不是很清楚,上網(wǎng)一查還覺得挺好玩,它是由老外提出來的狄克斯特拉用荷蘭文定義的,因為在荷蘭文中,通過叫passeren,釋放叫vrijgeven,PV操作因此得名。
為了在單處理機的情況下確定進程(process)能否占有處理機,狄克斯特拉將每個進程分為“就緒”(ready)、“運行”(running)和“阻塞”(blocking)三個工作狀態(tài)。由于在任一時刻最多只有一個進程可以使用處理機,正占用著處理機的進程稱為“運行”進程。當某進程已具備了使用處理機的條件,而當前又沒有處理機供其使用,則使該進程處于“就緒”狀態(tài)。當運行進程由于某種原因無法繼續(xù)運行下去時,就停止其占用處理機,使之進入“阻塞”狀態(tài),待造成其退出運行的條件解除,再進入“就緒”狀態(tài)。而對系統(tǒng)中所有同時運行的進程之間所存在的相互制約的同步(synchronization,指為了避免錯誤,在一個進程訪問共享數(shù)據(jù)時,另一個進程不訪問該數(shù)據(jù))和互斥(mutually-exclusive,指兩個進程不能同時在一個臨界區(qū)中使用同一個可重復使用的資源,諸如讀寫緩沖區(qū))兩個關系,狄克斯特拉巧妙地利用火車運行控制系統(tǒng)中的“信號燈”(semaphore,或叫“信號量”)概念加以解決。
用PV操作來管理共享資源時,首先要確保PV操作自身執(zhí)行的正確性。由于P(S)和V(S)都是在同一個信號量S上操作,為了使得它們在執(zhí)行時不發(fā)生因交叉訪問信號量S而可能出現(xiàn)的錯誤,約定P(S)和V(S)必須是兩個不可被中斷的過程,即讓它們在屏蔽中斷下執(zhí)行。把不可被中斷的過程稱為原語。于是,P操作和V操作實際上應該是P操作原語和V操作原語。
P操作的主要動作是:
①S減1;
②若S減1后仍大于或等于0,則進程繼續(xù)執(zhí)行;
③若S減1后小于0,則該進程被阻塞后放入等待該信號量的等待隊列中,然后轉(zhuǎn)進程調(diào)度。
V操作的主要動作是:
①S加1;
②若相加后結果大于0,則進程繼續(xù)執(zhí)行;
③若相加后結果小于或等于0,則從該信號的等待隊列中釋放一個等待進程,然后再返回原進程繼續(xù)執(zhí)行或轉(zhuǎn)進程調(diào)度。
PV操作對于每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執(zhí)行期間不允許有中斷發(fā)生。原語不能被中斷執(zhí)行,因為原語對變量的操作過程如果被打斷,可能會去運行另一個對同一變量的操作過程,從而出現(xiàn)臨界段問題。如果能夠找到一種解決臨界段問題的元方法,就可以實現(xiàn)對共享變量操作的原子性。
事實上,PV操作不僅是實現(xiàn)進程互斥的有效工具,而且還是一個簡單而方便的同步工具。用一個信號量與一個消息聯(lián)系起來,信號量的值為0表示期望的消息尚未產(chǎn)生;信號量的值為非0表示期望的消息已經(jīng)存在。假定用信號量S表示某個消息,現(xiàn)在來看看怎樣用PV操作達到進程同步的目的。
(1)調(diào)用P操作測試消息是否到達
任何進程調(diào)用P操作可測試到自己所期望的消息是否已經(jīng)到達。若消息尚未產(chǎn)生,則S=0,調(diào)用P(s)后,P(S)一定讓調(diào)用者成為等待信號量S的狀態(tài),即調(diào)用者此時必定等待直到消息到達;若消息已經(jīng)存在,則S≠0,調(diào)用P(S)后,進程不會成為等待狀態(tài)而可繼續(xù)執(zhí)行,即進程測試到自己期望的消息已經(jīng)存在。
(2)調(diào)用V操作發(fā)送消息
任何進程要向其他進程發(fā)送消息時可調(diào)用V操作。若調(diào)用V操作之前S=0,表示消息尚未產(chǎn)生且無等待消息的進程,則調(diào)用V(S)后,V(s)執(zhí)行S:=S+1使S≠0,即意味著消息已存在;若調(diào)用V操作之前S<0,表示消息未產(chǎn)生前已有進程在等待消息,則調(diào)用V(S)后將釋放一個等待消息者,即表示該進程等待的消息已經(jīng)到達,可以繼續(xù)執(zhí)行。 [1]?
在用PV操作實現(xiàn)同步時,一定要根據(jù)具體的問題來定義信號量和調(diào)用P操作或V操作。一個信號量與一個消息聯(lián)系在一起,當有多個消息時必須定義多個信號量;測試不同的消息是否到達或發(fā)送不同的消息時,應對不同的信號量調(diào)用P操作或V操作。
實現(xiàn)進程互斥
用PV操作可實現(xiàn)并發(fā)進程的互斥,其步驟如下:
(1)設立一個互斥信號量S,表示臨界區(qū),其取值為1,0,-1,…其中,S=1表示無并發(fā)進程進入S臨界區(qū);S=0表示已有一個并發(fā)進程進入了S臨界區(qū);S等于負數(shù)表示已有一個并發(fā)進程進入S臨界區(qū),且有|S|個進程等待進入S臨界區(qū),S的初值為1。
(2)用PV操作表示對S臨界區(qū)的申請和釋放。在進入臨界區(qū)之前,通過P操作進行申請,在退出臨界區(qū)之后,通過V操作釋放。
![pYYBAGKKD_WALqNMAAPvs0AKxYU358.png](https://file.elecfans.com/web2/M00/45/16/pYYBAGKKD_WALqNMAAPvs0AKxYU358.png)
審核編輯:湯梓紅
-
操作
+關注
關注
0文章
43瀏覽量
18927 -
處理機
+關注
關注
0文章
12瀏覽量
7907 -
信號量
+關注
關注
0文章
53瀏覽量
8379
發(fā)布評論請先 登錄
相關推薦
評論