信號量 與 PV操作含義


什么是信號量
信號量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的進程個數。注意,信號量的值僅能由PV操作來改變。
一般來說,信號量S>=0時,S表示可用資源的數量。執行一次P操作意味着請求分配一個單位資源,因此S的值減1;當S<0時,表示已經沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。而執行一個V操作意味着釋放一個單位資源,因此S的值加1;若S<0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。

PV操作
PV操作是典型的同步機制之一, PV操作與信號量的處理相關,P表示通過的意思,V表示釋放的意思。PV操作即可實現同步,也可以實現互斥。

P操作意味着請求分配一個資源 : 也稱為down()/wait()操作,使S=S-1,若S<0,進程暫停執行,放入信號量的等待隊列.

V操作意味着釋放一個資源 : 也稱為up()/signal()操作,使S=S+1,若S<=0,喚醒等待隊列中的一個進程.

關於搶占和非搶占

搶占式: v釋放資源 資源數<=0 喚醒對隊列中的進程,轉到喚醒的進程
非搶占式: v釋放資源 資源數<=0 喚醒對隊列中的進程,繼續執行當前進程
 

 

什么是互斥
互斥是進程(線程)之間的間接制約關系。當一個進程(線程)進入臨界區使用臨界資源時,另一個進程(線程)必須等待。只有當使用臨界資源的進程退出臨界區后,這個進程才會解除阻塞狀態。簡單的來說,就是某一資源同一時間只能由一個進程(線程)訪問。

類似的場景:

比如進程B需要訪問打印機,但此時進程A占有了打印機,進程B會被阻塞,直到進程A釋放了打印機資源,進程B才可以繼續執行
比如某一個共享代碼片段,同一個時間,只能由一個線程執行,當有一個線程執行時,其它線程將會等待

 


什么是同步
同步是進程(線程)之間直接的制約關系,是為完成某種任務而建立的兩個或多個線程,這個線程需要在某些位置上協調他們的工作次序而等待、傳遞信息所產生的制約關系,進程(線程)間的直接制約關系來源於他們之間的合作關系(依賴關系)。所以同步是一種更為復雜的互斥。簡單的來說,就是進程(線程)的運行必須嚴格按照某種先后次序來運行,從而完成的特定的任務。


類似的場景:

比如線程A、B同時允許某計算任務,線程A的計算任務在某一時刻的依賴於線程B任務產生的數據,這時候如果線程B 還未產生相應的數據,線程A只好等待線程B,只有線程B計算出相應的結果后線程A在接着往下運行。
比如進程A需要從緩沖區讀取進程B產生的信息,當緩沖區為空時,進程A因為讀取不到信息而被阻塞。而當進程B產生信息放入緩沖區時,進程A才會被喚醒。
使用PV操作實現同步操作
用一個信號量S與一個消息(或者資源)聯系起來,當信號量的值為0時,表示期望的消息尚未產生(或者資源不可用);當信號量的值S>0時,表示期望的消息已經存在(有資源可用)。用P V操作實現進程同步時,調用P操作測試消息是否到達(是否有資源可用),調用V操作發送消息(添加資源)。

 

使用PV操作實現進程(線程)同步時應該注意的是:

分析進程(線程)間的制約關系,確定信號量種類。在保持進程(線程)間有正確的同步關系情況下,哪個進程先執行,哪些進程后執行,彼此間通過什么資源(信號量)進行協調,從而明確要設置哪些信號量。
信號量的初值與相應資源的數量有關,也與P、V操作在程序代碼中出現的位置有關。
同一信號量的P、V操作一般必須要成對出現,但它們分別在不同的進程(線程)代碼中。
使用PV操作實現互斥操作
使用PV操作實現進程互斥時應該注意的是:

同一信號量的P、V操作必須要成對出現,且出現在同一的進程(線程)代碼中。
每個互斥的P、V操作必須成對出現,先做P操作,進臨界區,后做V操作,出臨界區。若有多個分支,要認真檢查其成對性, 否則會造成死鎖。
P、V操作應分別緊靠臨界區的頭尾部,臨界區的代碼應盡可能短,不能有死循環。
互斥信號量的初值一般為1

非搶占式: v釋放資源 資源數<=0 喚醒對隊列中的進程,繼續執行當前進程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM