對記錄型訊號量的理解
轉載自http://blog.chinaunix.net/uid-20740497-id-1879214.html
記錄型訊號量:需要一個用於代表資源數目的整型變數value外,還應增加一個程式連結串列L,用於連結等待程式。兩個資料項可描述為:
type semaphore=record
value:integer;
L:list of process;
end
圖1
相應地,wait(S)和signal(S)操作可描述為:
procedure wait(S)
var S:semaphore;
begin
S.value:=S.value-1;
if S.value<0 then block(S,L)
End
procedure signal(S)
var S:semaphore;
begin
S.value:=S.value+1;
if S.value≤0 then wakeup(S,L);
end
在記錄型訊號量機制中,S.value的初值表示系統中某類資源的數目,因而又稱為資源訊號量,對它的每次wait操作,意味著程式請求一個單位的該資源,因此描述為S.value:=S.value-1;當S.value<0時,表示該類資源已分配完畢,因此程式應呼叫block原語,進行自我阻塞,放棄處理機,並插入到訊號量連結串列S.L中。可見,該機制遵循了“讓權等待”準則。此時S.value的絕對值表示在該訊號量連結串列中已阻塞程式的數目。對訊號量的每次signal操作,表示執行程式釋放一個單位資源,故S.value:=S.value+1操作表示資源數目加1.若加1後仍是S.value≤0,則表示在該訊號量連結串列中,仍有等待該資源的程式被阻塞,故還應該呼叫wakeup原語,將S.L連結串列中的第一個等待程式喚醒。如果S.value的初值為1,表示只允許一個程式訪問臨界資源,此時的訊號量轉化為互斥訊號量。
以上內容摘之《計算機作業系統》,下面我談談對記錄型訊號量的認識:如上圖1,你看上去是不是很像我們學習過的C語言定義的資料結構,它就是因此而得名的。只不過它是pascal語言書寫的而已,那看下面兩個方框,一個是wait,另一個是signal,是不是很像我們學的C語言啊。每次wait操作就是給程式分配一個單位的資源,每次signal操作就是程式釋放一個單位資源。
現在我們假設我的電腦有兩臺印表機,所以S.value的初值為2,表示系統印表機的數目,稱為資源訊號量。程式A請求列印,那麼系統對它執行一次wait操作,執行S.value:=S.value-1語句後S.value減1,S.value的值變為1,表示有一個資源空閒。執行if語句,S.value不小於0,結束。然後又來了一個程式B請求列印,系統對它又執行一次wait操作,執行S.value:=S.value-1語句後S.value減1,S.value的值變為0,表示沒有空閒的資源。執行if語句,S.value不小於0,結束。又來一個程式C請求列印,系統對它又執行一次wait操作,執行S.value:=S.value-1語句後S.value減1,S.value的值變為-1,表示有一個程式沒有得到印表機資源。執行if語句,S.value小於0,執行block(S,L),進行自我阻塞,放棄處理機,並插入到訊號量連結串列S.L中。此時S.value的絕對值表示了在該訊號量連結串列中已阻塞程式的數目。所以這個時候阻塞的程式為一個,即是程式C。
系統執行了一段時間後,A程式結束,在結束前執行了signal操作,當執行到S.value:=S.value+1語句時,S.value加1,即S.value變為0.然後執行 if 語句,S.value小於等於0,執行wakeup(S,L),從S.L連結串列中喚醒C程式。過了一會,B程式結束,同樣執行signal操作,S.value變為1,表示有一個資源空閒。緊接著C程式也結束了,S.value變為2。S.value最終等於初值,等待其他的程式進行資源請求。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30046312/viewspace-2135599/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)筆記
- django的訊號量Django
- MySQL:簡單記錄訊號處理MySql
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- 記錄在JavaScript中對事件迴圈的理解JavaScript事件
- 訊號量、訊息佇列、共享記憶體複習佇列記憶體
- system -v 訊號量的使用
- liteos訊號量(八)
- Python 訊號量Python
- 初步理解Python程式的訊號通訊Python
- 使用訊號量進行同步的共享記憶體機制記憶體
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- 程序間通訊(4)-訊號量
- 對HTML語義化的一些理解和記錄HTML
- 2.3.2 訊號量機制——作業系統筆記作業系統筆記
- 10. Semaphore ||(訊號量)
- 程式間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)記憶體佇列執行緒變數
- 域名解析的記錄型別:A記錄、CNAME、MX記錄、NS記錄型別
- Java-對多型的理解Java多型
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- 對Vue元件通訊的理解Vue元件
- 程式通訊之無名訊號量
- 臨界區,互斥量,訊號量,事件的區別事件
- Semaphore-訊號量的實現分析
- Linux中訊號量的實現Linux
- Linux中的System V訊號量Linux
- linux 下的訊號量引數Linux
- 筆記本的CPU型號筆記
- DNS中MX記錄的理解DNS
- 自定義訊息和對訊息的理解
- Semaphore訊號量原始碼解析原始碼
- IPCS ipcrm刪除訊號量
- Linux程式間通訊——使用訊號量Linux
- VC訊號量和執行緒的用法執行緒
- DNS中MX記錄的理解(轉)DNS
- oracle中的共享記憶體和訊號量的一個簡單解釋Oracle記憶體
- ORACLE在各作業系統訊號量與共享記憶體的維護Oracle作業系統記憶體
- 又是訊號量和共享記憶體沒有釋放的db待機記憶體