1. 程式人生 > >臨界資源、臨界區、訊號量、P,V操作

臨界資源、臨界區、訊號量、P,V操作

一、資源:Linux上有硬體資源軟體資源之分。程式會受到資源限制的影響,可能在這幾方面的資源限制受到影響:1.硬體方面的物理性限制(記憶體);2.系統策略的限制(允許使用的CPU時間);3.具體實現的限制(整數的長度、檔名中所允許的最大字元數)。
二、臨界資源:臨界資源是一次僅允許一個程序使用的共享資源。每次只准許一個程序進入臨界區,進入後不允許其他程序進入。不論是硬體臨界資源,還是軟體臨界資源,多個程序必須互斥地對它進行訪問。
三、臨界區:臨界區指的是一個訪問共用資源(例如:共用裝置或是共用儲存器)的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待(例如:bounded waiting 等待法),有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥
獲得使用,例如:semaphore。只能被單一執行緒訪問的裝置,例如:印表機。

四、訊號量:訊號量(Semaphore)有時被稱為訊號燈,是解決併發問題過程中所使用的一種設施,可以用來保證兩個或多個關鍵程式碼段不被併發呼叫。一個程序在進入一個關鍵程式碼段之前,程序(或執行緒)必須獲取一個訊號量;一旦關鍵程式碼段完成了,那麼該程序(或執行緒)必須釋放訊號量。其它想進入該關鍵程式碼段的程序(或執行緒)必須等待直到第一個程序(或執行緒)釋放訊號量。
從併發機制的角度看,訊號量是一種併發機制,它用於程序間傳遞訊號的一個整數值。在訊號量上只有3中操作可以進行:初始化、遞減和增加,這三種都是原子操作。遞減操作可以用於阻塞
一個程序,增加操作可以用於解除阻塞一個程序。也成為計數訊號量或一般訊號量。(其它的並行機制還有很多,如二元訊號量、互斥量、自旋鎖、事件標誌等)

簡單的理解:訊號量:特殊變數,加1(v操作,釋放資源),減1(p操作,獲取資源),都是一個原子操作,值為0,減1阻塞。訊號量用來同步程序。同步:只有一個程式在執行。
五、原子操作:它在執行過程中不能被打斷。
六、P,V操作:實際上p操作就是-1(獲取資源),v操作就是+1(釋放資源)。
我的理解也就是訊號量用來解決互斥問題的一種方法。設訊號量為s,設有n個程序,所有的程序都需要訪問共享資源。每個程序中進入臨界區前執行semWait(s),如果s的值為負,則程序被阻塞,s的絕對值就是被阻塞程序的數量;如果值為1,則s被減為0,程序立即進入臨界區;由於s不再為正,因而其他任何程式都不能進入臨界區。訊號量一般初始化為1,這樣第一個執行semWait的程序可以立即進入臨界區,並把s的值置為0。接著任何試圖進入臨界區的其他(一個)程序,都將發現第一個程序忙,因此被阻塞,把s的值置為-1。可以有任意數目的程序試圖進入,每個不成功的嘗試都會使s的值減1,當最初進入臨界區的程序離開時,s的值增1
,一個被阻塞的程序(如果有的話)被移出阻塞佇列,置為就緒狀態(這裡的s的值增1和一個阻塞程序被移出置為就緒狀態是一步完成的)。這樣,當作業系統下一次排程時,它可以進入臨界區,並把訊號量的值置為0。

PV操作與訊號量的處理相關,P表示通過的意思,V表示釋放的意思。p操作和v操作是不可中斷的程式段,稱為原語。如果將訊號量看作共享變數,則pv操作為其臨界區,多個程序不能同時執行,一般用硬體方法保證。一個訊號量只能置一次初值,以後只能對之進行p操作或v操作。
使用PV操作實現程序互斥時應該注意的是:
⑴每個程式中使用者實現互斥的P、V操作必須成對出現,先做P操作,進臨界區,後做V操作,出臨界區。若有多個分支,要認真檢查其成對性。
⑵P、V操作應分別緊靠臨界區的頭尾部,臨界區的程式碼應儘可能短,不能有死迴圈。
⑶互斥訊號量的初值一般為1。
七、一些其它的知識
1.二值訊號量   0   1
2.計數訊號量   可能會>1
3.semget 建立訊號量
semop  修改訊號量的值   實現p v操作
semctl   初始化訊號量  刪除
4.訊號量的使用
1)建立訊號量,初始化值為1
2)提供P V操作
3)使用臨界資源之前執行P操作,用完執行V操作
4)銷燬訊號量
5.ipcs命令
ipcs –q  檢視訊息佇列      ipcs  -s
ipcrm  -s  +訊號量id:手動清楚訊號量
ipcs  -m  顯示共享記憶體