解決程序同步與互斥問題的機制。
一種特殊變數,表現形式是乙個整數semaphore和乙個佇列。
s>=0時,s表示可用資源的數量。
s<0時,已經沒有可用資源,s的絕對值表示當前等待該資源的程序數。
s=s-1
使用資源,此時如果s<0,則掛起該程序。
s=s+1
釋放資源,此時如果s<0,從阻塞佇列裡喚醒乙個程序。
互斥控制為了保護共享資源,不讓多個程序同時訪問該資源。
這種一次只讓乙個程序訪問的資源稱為臨界資源,訊號量初值設為1。
在互斥關係中,pv操作在乙個程序中成對出現。
p(s)
臨界區v(s)
最簡單同步形式是a在b到達l2之前不能超過l1。
設定訊號量s初值為0,a到達l1後執行p操作後掛起,直到b到達l2後執行v操作將a喚醒。
在同步操作中,pv操作在兩個甚至多個程序中成對出現。
程序a
程序b
l1 p(s)
l2 v(s)
也稱有限緩衝問題。生產者生成資料項放到緩衝區(bound為n)中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。
要解決該問題,就必須讓生產者在緩衝區滿時休眠,等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。
訊號量
初值
描述
empty
n緩衝區空項數
full
0緩衝區非空項數
mutex1互斥
生產者
消費者
p(empty)
p(mutex)
緩衝區加資料項
v(mutex)
v(full)
p(full)
p(mutex)
緩衝區減資料項
v(mutex)
v(empty)
指多個程序對乙個共享資源進行讀寫操作的問題,多個程序同時讀是可以接受的,同時只能有乙個程序寫,寫時不能讀。
寫者要等到沒有讀者的時候才能去寫檔案,所有讀者要等待寫者寫完檔案後才能去讀檔案。
訊號量
初值
描述
readmutex
1讀互斥
writemutex
1寫互斥
變數
初值
描述
count
0讀者數
讀者
寫者
p(readmutex)
if(count == 0)
p(writemutex)
++count
v(readmutex)
讀資料p(readmutex)
--count
if(count == 0)
v(writemutex)
v(readmutex)
p(writemutex)
寫資料v(writemutex)
理髮店理有一位理髮師、一把理髮椅和n把供等候理髮的顧客坐的椅子如果沒有顧客,理髮師便在理髮椅上睡覺乙個顧客到來時,它必須叫醒理髮師如果理髮師正在理髮時又有顧客來到,則如果有空椅子可坐,就坐下來等待,否則就離開。
訊號量
初值
描述
customers
0等候的顧客數
barbers
0等候的理髮師數,0或1
mutex
1count訪問互斥
變數
初值
描述
count
0椅子上等待的顧客數,bound為n
理髮師
顧客
p(customers)
p(mutex)
--count
v(barbers)
v(mutex)
理髮師理髮
p(mutex)
if(count < n)else
v(mutex)
哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一:吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。
哲學家從來不交談,這就很危險,可能產生死鎖,每個哲學家都拿著左手的餐叉,永遠都在等右邊的餐叉(或者相反)。
訊號量與PV操作
1 訊號量 訊號量 semaphore 的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。訊號量s表示了作業系統中...
訊號量,PV操作
它從整型訊號量 記錄型訊號量,進而發展為 訊號量集 機制 訊號量集,就是訊號量的集合 現在要用的是記錄型訊號量 1,訊號量幹嘛用的?訊號量 解決程序間同步與互斥問題 2.訊號量的組成 訊號量 分很多種,在此寫記錄型訊號量 record semaphore 訊號量組成 每個訊號量s除乙個整數值s.va...
訊號量同步 P V 操作
訊號是 e.w.dijkstra 在二十世紀六十年代末設計的一種程式設計架構。dijkstra 的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車...