對記錄型訊號量的理解
轉載自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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記錄在JavaScript中對事件迴圈的理解JavaScript事件
- MySQL:簡單記錄訊號處理MySql
- STM32的UCOS訊號量和互斥訊號量
- django的訊號量Django
- 對HTML語義化的一些理解和記錄HTML
- Java-對多型的理解Java多型
- 訊號量的使用 ManualResetEvent
- POSIX 訊號量
- DNS中MX記錄的理解DNS
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- 筆記本的CPU型號筆記
- system -v 訊號量的使用
- 對Vue元件通訊的理解Vue元件
- Python執行緒專題5:訊號量與有邊界的訊號量Python執行緒
- liteos訊號量(八)
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- rt-thread學習筆記——8、建立訊號量thread筆記
- 2.3.2 訊號量機制——作業系統筆記作業系統筆記
- Linux中訊號量的實現Linux
- Linux中的System V訊號量Linux
- 型別的本質:對變數、型別、指標的理解型別變數指標
- 程序間通訊(4)-訊號量
- 10. Semaphore ||(訊號量)
- Semaphore-訊號量的實現分析
- 什麼是多型?物件導向中對多型的理解多型物件
- 理解記憶體對齊記憶體
- 對HashMap的一次記錄HashMap
- 淺談對標記永久化的理解
- ORACLE在各作業系統訊號量與共享記憶體的維護Oracle作業系統記憶體
- python學習之訊號量Python
- Semaphore訊號量原始碼解析原始碼
- git 修改之前提交記錄的某幾次記錄的賬號和郵箱Git
- 訊號與槽N對N
- 我對視訊號的思考和挑戰
- Qt中對js和HTML通訊的理解QTJSHTML
- 對C語言中無符號型別的建議C語言符號型別
- 針對於debugger斷點的記錄斷點
- 檢視伺服器型號、記憶體槽位、磁碟等資訊伺服器記憶體
- SpringBoot 結合官網對MQTT訊息佇列整合記錄Spring BootMQQT佇列