1. 訊號量的定義
除初始化外,僅能由同步原語對其進行操作的整型變數。
2. 訊號量的分類
整型訊號量、記錄型訊號量、and型訊號量、訊號量集
按照用途分類,又可分為兩大類:
二元訊號量:用作互斥變數,初值為1
一般訊號量:用於一般同步,初值為共享資源的初始數量
1. 整型訊號量的定義
除初始化外,僅能通過兩個標準的原子操作 wait(s) 和 siganl(s) 訪問的整型變數s。用於表示資源數目。
2. 同步原語
為什麼又叫做p、v操作呢?因為是它們是「測試」和「增加」的荷蘭語首字母。
p、v操作是兩個原子操作,因此,在執行過程中是不可中斷的。
p() / wait () :測試資源數量(即訊號量s)是否大於0
v() / signal () :使資源數量(即訊號量s)加一,表示執行程序釋放乙個單位的資源
wait () 操作可描述如下:
wait( s )
signal () 操作可描述如下:
signal( s )
對整型訊號量的缺陷做出了改進:
整型訊號量機制的 wait 操作中,只要訊號量s<=0,就會一直測試。因此,該機制並沒有遵循「讓權等待」的原則(不知道什麼是讓權等待的可以去看我的【os筆記 14】),而是處於忙等狀態。
記錄型訊號量則克服了「忙等」,下面來講解:
1. 記錄型訊號量的組成
① 用於表示資源數目的整型變數 value (但是這裡可以是負數,比如 value = -5,表示已經有5個程序在等待該資源了)
② 程序鍊錶指標 list,用於鏈結所有正在等待資源的程序
2. wait 和 signal 操作的描述
其中,block()原語是程序用來自我阻塞的,也就是放棄了處理機,這樣也就避免了忙等。
舉個例子來講一下具體過程,更好理解:
value 初值為5。接下來依次有五個程序 abcde 各使用了乙個資源,那麼此時value = 0。
現在又來了兩個程序 fg,各請求了乙個資源,那麼此時 value = -2,這兩個程序都處於阻塞態。
a首先使用完畢,釋放了資源,呼叫 signal 操作,value++之後變成 -1,然後從阻塞鍊錶中取出頭部的那個程序f,使用 wakeup() 原語把它喚醒。
然後b釋放資源,value變成0,value<=0 說明還有程序在阻塞,繼續喚醒g。
然後c釋放資源,value變成1,說明已經沒有阻塞的程序了,不需要喚醒。
16 程序同步與死鎖 程序同步與訊號量
司機 while true 售票員 while true 印表機按照列印佇列執行列印,當列印佇列中有 6個列印任務,2個程序同時新增列印任務,列印佇列的第7個任務是哪個,需要協調 小結 程序有自己的執行條件,有時執行 有時等待,執行完 可能也要 發出訊號,讓等待該訊號的其他程序執行 程序同步 就是 ...
OS 李治軍 L16 程序同步與訊號量
引例 多程序合作要溝通好。總不能售票員還在賣票的時候就開車。在停車的時候,司機在等售票員的乙個訊號,這樣他才可以開車。在開車的時候,售票員也在等司機的乙個訊號,這樣他才可以開門。形成一種合理有序向前推進的工作。程序同步的核心 等!等訊號!但是,只發訊號還是解決不了全部問題。如果框滿了,來了兩個生產者...
程序同步 訊號量機制
由dijkstra提出,目前已廣泛應用於單處理機和多處理機系統以及計算機網路中。一 整形訊號量 1.s 乙個用於表示資源數目的整型量 2.與一般整型量不同,除初始化外,僅能通過兩個標準的原子操作 wait s 和signal s 長期以來一直被稱為p v操作 3.wait操作偽碼描述 wait s ...