訊號量 摘自《現代作業系統》

2021-08-13 03:32:21 字數 821 閱讀 5821

訊號量是e.w.dijkstra在2023年提出的一種方法,它使用乙個整型變數來累計喚醒次數,供以後使用。在他的建議中引入了乙個新的變數型別,稱作訊號量(semaphore)。乙個訊號量的取值可以為0(表示沒有儲存下來的喚醒操作)或者為正值(表示有乙個或多個喚醒操作)。

dijkstra建議設立兩種操作:down和up(分別為一般化後的sleep和wakeup)。對一訊號量執行down操作,則是檢查其是否大於0. 若該值大於0,則將其值減一(即用掉乙個儲存的喚醒訊號)並繼續;若該值為0,則將程序睡眠,並且此時down操作並未結束。檢查數值,修改變數值以及可能發生的睡眠操作均作為乙個單一的,不可分割 原子操作完成。保證一旦乙個訊號量操作開始,則在該操作完成或阻塞之前,其他程序均不允許訪問該訊號量。這種原子性對於解決同步問題和避免競爭條件是絕對必要的。所謂原子操作,是指一組相關聯的操作要麼都不間斷地執行,要麼都不執行。原子操作在電腦科學的其他領域也是非常重要的。

up操作對型號量的值增1. 如果乙個或者多個程序在該訊號量上睡眠,無法完成乙個先前的down操作,則由系統選擇其中乙個(如隨機挑選)並允許該程序完成它的down操作。於是,對乙個有程序在其上睡眠的訊號量執行一次up操作之後,該訊號量的值仍舊是0,但在其上睡眠的程序卻少了乙個。訊號量的值增1和喚醒乙個程序同樣也是不可分割的。不會有某個程序因執行up而阻塞,正如在前面的模型中不會有程序因執行wakeup而阻塞一樣。

順便提一下,在dijkstra原來的**中,他分別使用名稱p和v而不是down和up,在荷蘭語中,proberen的意思是嘗試,verhogen的含義是增加或公升高。由於對於不講荷蘭語的讀者來說採用什麼記號並無大的干係,所以我們將使用down和up名稱。它們在程式語言algol68中首次引入。

作業系統訊號量

本文將針對較為簡單的生產者消費者問題,給出利用訊號量解決問題的方法。生產者 能產生並投放資源的程序 消費者 單純使用 消耗 資源的程序 問題表述 一組 生產者程序和一 組消費者程序 設每組有多個程序 通過緩衝區發生聯絡。生產者程序將生產的產品 資料 訊息等統稱為產品 送入緩衝區,消費者程序從中取出產...

作業系統 訊號量

代表了一類物理資源,是相應的物理資源的抽象,通常為整型或結構體型,除了初始化之外,其他情況下只能使用p v進行操作 執行一次p s 則s.value減一,若執行p s 之後s.value 0,則表示該類資源可用,否則不可用 執行一次v s 則s.value加一,若執行v操作以後,s.value的值仍...

作業系統 訊號量機制

用乙個整數型的變數作為訊號量,用來表示股系統中某種資源的數量。與普通整數變數的區別 對訊號量的操作只有三種,初始化,p操作,v操作。p操作 相當於wait原語,進入區 v操作 signal原語,相當於退出區。大體實現 wait 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...