信號量
編輯在計算機科學中,信號量是一種變量或抽象數據類型,用于控制多個線程對公共資源的訪問并避免并發系統(如多任務操作系統)中的臨界區問題。 信號量是一種同步原語。 普通信號量是根據程序員定義的條件更改(例如,遞增或遞減或切換)的普通變量。
將信號量視為在現實世界系統中使用的一種有用的方法是記錄有多少個特定資源的單位可用,加上操作以安全地調整該記錄(即避免競爭條件)作為單位 獲得或變得免費,并且,如果有必要,等待直到資源的一個單元變得可用。
信號量是防止競爭條件的有用工具; 但是,使用它們并不能保證程序沒有這些問題。 允許任意資源計數的信號量稱為計數信號量,而限制為值 0 和 1(或鎖定/未鎖定、不可用/可用)的信號量稱為二進制信號量,用于實現鎖定。
信號量概念是由荷蘭計算機科學家 Edsger Dijkstra 在 1962 年或 1963 年發明的,當時 Dijkstra 和他的團隊正在為 Electrologica X8 開發操作系統。 該系統最終被稱為多道程序系統。
類比圖書館
編輯假設一個圖書館有 10 個相同的自習室,一次供一個學生使用。 如果學生想使用自習室,他們必須向前臺申請房間。 如果沒有房間空閑,學生會在辦公桌前等待,直到有人放棄房間。 當學生用完一個房間后,學生必須返回桌子并表明一個房間已空閑。
在最簡單的實施中,前臺的職員只知道可用房間的數量,他們只有在所有學生在他們注冊并在完成后歸還他們的房間時實際使用他們的房間時才能正確知道 . 當學生要求房間時,店員會減少這個數字。 當學生釋放一個房間時,店員會增加這個數字。 房間可無限次使用,無法提前預約。
在這個場景中,前臺計數員代表一個計數信號量,房間是資源,學生代表進程/線程。 此場景中信號量的值最初為 10,所有房間都是空的。 當一個學生申請房間時,他們被授予訪問權限,信號量的值變為 9。下一個學生來后,它下降到 8,然后是 7,依此類推。 如果有人請求房間并且信號量的當前值為 0,他們將被迫等待直到房間被釋放(當計數從 0 開始增加時)。 如果其中一個房間被釋放,但有幾個學生在等待,那么可以使用任何方法來選擇將占用房間的人(例如 FIFO 或隨機選擇一個)。 當然,學生在真正離開房間后才需要通知店員釋放他們的房間,否則,當學生在離開房間的過程中(他們正在收拾課本等)時,可能會出現尷尬的情況。 另一個學生在他們離開之前進入了房間。
重要觀察
當用于控制對資源池的訪問時,信號量僅跟蹤有多少資源是空閑的; 它不會跟蹤哪些資源是免費的。 可能需要一些其他機制(可能涉及更多信號量)來選擇特定的空閑資源。
該范例特別強大,因為信號量計數可以作為許多不同操作的有用觸發器。 當沒有學生時,上面的圖書管理員可能會關掉自習室的燈,或者可能會在大部分房間都被占用時放置一個標語,說房間很忙。
該協議的成功需要應用程序正確地遵循它。 如果即使是單個進程行為不正確,公平性和安全性也可能受到損害(這實際上意味著程序可能運行緩慢、行為不穩定、掛起或崩潰)。
這包括:
- 請求資源卻忘記釋放;
- 釋放從未被請求的資源;
- 長期持有資源而不需要它;
- 在未先請求(或釋放資源)的情況下使用資源。
即使所有進程都遵循這些規則,當存在由不同信號量管理的不同資源以及進程需要一次使用多個資源時,多資源死鎖仍可能發生,如哲學家就餐問題所示。
語義和實現
編輯計數信號量配備了兩個操作,歷史上表示為 P 和 V。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/198045/