PV操作和訊號量

2021-05-02 12:14:08 字數 1038 閱讀 7283

乙個程序被分為了"就緒(ready)","執行(running)"和"阻塞(blocking)"三個工作狀態,當前用處理器的哪個程序是"執行"狀態,當前已經具備了使用處理器的條件而等待處理器的程序是處於就緒狀態的程序,當執行的程序由於某種原因無法繼續使用處理器的時候就停止他使用處理器使他進入"阻塞"狀態,當他的條件再次的滿足的時候再次進入就緒狀態.

而系統中的幾個程序在乙個訪問某資源(讀寫快取區)和資料(共享資料)的時候是互斥的,而解決這個問題的時候就用到了一種同步機制叫"pv"操作 他們是倆個執行的時候不能被打斷的倆個操作原語句,

執行p操作p(s)時候訊號量s的值減去一,若不為負則p(s)執行完畢,否則等待p操作的程序暫停來釋放資源

執行v操作v(s)時候訊號量s的值加上一,若不大於零則釋放乙個因為執行p(s)而等待的程序.對p1,p2可定義倆個訊號量s1,s2初始值為1,0,程序p2在從緩衝b讀取資料前執行p操作p(s2)在讀出資料後執行v操作v(s1),當p1往緩衝b送入一資料後訊號量s1變為0,在該資料讀取之後才又變為1,因此前一資料 沒有讀取之前後乙個資料不會送入,從而保證了p1 p2同步

用偽程式來說就是這樣:

p就是請求資源,v就是釋放資源。

例如乙個司機與售票員的例子

在公共汽車上,為保證乘客的安全,司機和售票員應協調工作:

停車後才能開門,關車門後才能行車。用pv操作來實現他們之間的協調。

s1:是否允許司機啟動汽車的變數

s2:是否允許售票員開門的變數

driver()//司機程序

while (1)//不停地迴圈

p(s1);//請求啟動汽車

啟動汽車;

正常行車;

到站停車;

v(s2); //釋放開門變數,相當於通知售票員可以開門

busman()//售票員程序

while(1)

關車門;

v(s1);//釋放開車變數,相當於通知司機可以開車

售票p(s2);//請求開門

開車門;

上下乘客;

注意:busman() driver() 兩個不停迴圈的函式

PV操作和訊號量

1 訊號量的型別定義 訊號量 semaphore 的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。一般來說,訊號...

訊號量,PV操作

它從整型訊號量 記錄型訊號量,進而發展為 訊號量集 機制 訊號量集,就是訊號量的集合 現在要用的是記錄型訊號量 1,訊號量幹嘛用的?訊號量 解決程序間同步與互斥問題 2.訊號量的組成 訊號量 分很多種,在此寫記錄型訊號量 record semaphore 訊號量組成 每個訊號量s除乙個整數值s.va...

訊號量同步 P V 操作

訊號是 e.w.dijkstra 在二十世紀六十年代末設計的一種程式設計架構。dijkstra 的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車...