訊號量是一種常用的併發機制。基本原理:
兩個或多個程序可以通過簡單的訊號合作,可以強迫乙個程序在某個位置停止,直到它接收到乙個特定的訊號。任何複雜的合作都可以通過適當的訊號結構得到滿足。為了發訊號,需要使用到乙個訊號量的特殊變數。要通過訊號量s傳送訊號,程序必須執行semsignal(s)(v操作),要通過訊號量s接收訊號,程序必須執行原語semwait(s)(p操作);若相應的訊號未被發出,則阻塞程序,直到傳送完為止。以上是從書中摘錄出來的有關訊號量的基本原理。
實際上,我理解的訊號量應該像是乙個計數器更準確,對於這個計數器我們可以定義三個操作為了達到互斥的效果。
可以將該訊號量也就是計數器初始化為乙個非負整數
p操作使訊號量減一;若值減為負數,則阻塞當前申請的程序,否則程序繼續執行。
v操作使訊號量加一;若值小於等於0,則將當前阻塞程序接觸阻塞。
我們假設乙個場景來解釋以上定義:
比如說,一件自習室裡有十個座位。那麼我們用s表示計數器用來表示當前教室的可用資源也就是座位。
現在來了乙個同學,想要進入自習室自習,他發現這個計數器為10,說明可以進入,所以它向管理員申請進入,並且得到許可,可以進入自習室自習。此時,當然計數器就變為9了。
後來,又陸陸續續來了幾個同學,直到計數器變成了0。此時再來這個教室申請座位的同學發出申請之後就會被阻塞,因為該教室已經沒有座位了,意味著他需要在門口一直等。
等了一會兒之後,有乙個同學出來了,計數器此時由於可用資源多一,所以將計數器加一,此時計數器由0至1,也就意味著,此時在門口等待的這位同學可以進入教室了。
實際上在作業系統中,同學就好像程序,教室的座位就像程序所需臨界資源。計數器就是我們所說的訊號量。
下面我們來理理:
訊號量是乙個計數器,用來記錄進入該臨界資源的程序數。若訊號量s小於等於0,說明此時沒有可用的臨界資源,那麼此時在向該臨界資源申請資源的程序就會被阻塞。如果一旦有程序釋放該臨界資源,那麼訊號量s就會加1,此時被阻塞的程序就會解除阻塞,並且成功申請到臨界資源。
我們將以上動作中,申請臨界資源,訊號量減一的動作-稱為p操作。
釋放臨界資源,訊號量加一的動作稱為-v操作。
並且p v操作都是原子性的
訊號量s表示的意義:
下面給出原語的定義:
struct semaphore;
void semwait(semaphore s)
}void semsignal(semaphore s)
}
下面給出對二元訊號量的定義:
struct binary_semaphore; value;
queuetype queue;
};void semwait(binary_semaphore s)
}void semsignal(binary_semaphore s)
}
互斥是乙個程式設計標誌位,用來獲取和釋放乙個物件。當需要的資料不能被分享或處理,進而導致在系統中的其他地方不能同時執行時,互斥被設定為鎖定,用於阻塞其他程式使用資料。當資料不再需要或程式執行結束時,互斥被設定為非鎖定。互斥與二元訊號量的區別:為互斥量加鎖的程序和為互斥量解鎖的程序必須時同乙個程序。相比之下,可能由某個程序對二元訊號量進行加鎖操作,由另乙個程序為其解鎖。(其實,在一些文獻和教材中,互斥鎖與二元訊號量並未區別。)
不論是二元訊號量還是級數訊號量,都需要乙個佇列來儲存當前正在等待的程序,那麼就產生乙個問題,程序按照什麼順序從佇列中移除?
最公平的策略是先進先出:被阻塞時間最久的先從佇列中移除。採用這一種策略的稱為強訊號量,而沒有規定程序從佇列中移除順序的訊號量稱為弱訊號量。強訊號量保證不會飢餓,而弱訊號量則無法保證。
作業系統訊號量
本文將針對較為簡單的生產者消費者問題,給出利用訊號量解決問題的方法。生產者 能產生並投放資源的程序 消費者 單純使用 消耗 資源的程序 問題表述 一組 生產者程序和一 組消費者程序 設每組有多個程序 通過緩衝區發生聯絡。生產者程序將生產的產品 資料 訊息等統稱為產品 送入緩衝區,消費者程序從中取出產...
作業系統 訊號量
代表了一類物理資源,是相應的物理資源的抽象,通常為整型或結構體型,除了初始化之外,其他情況下只能使用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 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...