使用者程序可以通過使用乙個變數(可以是乙個整數,也可以是更為複雜的記錄型變數),可以用乙個訊號量來表示系統中某種資源的數量。比如:系統中只有一台印表機,就i可以設定乙個初值為1的訊號量。
原語是一種特殊的程式段,其執行只能一氣呵成,不可被中斷。原語是由關中斷/開中斷指令實現的。
wait(s)原語和signal(s)原語,可以把原語理解成我們自己寫的函式,函式名分別為wait和signal,括號裡的訊號量s其實就是函式呼叫時傳入的乙個引數。wait和signal原語簡稱p、v操作(來自荷蘭語proberen和verhogen)。
/**
例如:作業系統中只有一台印表機。。。。
**/int s=1;
//wait原語相當於"進入區"
void wait(int s)
//signal原語相當於"退出區"
void signal(int s)
typedef
struct
semaphore;
/**某程序要申請資源時,通過wait原語申請**/
void
wait
(semaphore s)
}/**某程序使用完資源後,通過signal原語釋放資源**/
void
signal
(semphore s)
}
步驟:
分析併發程序的關鍵活動,劃定臨界區
設定互斥訊號量mutex
在臨界區之前執行p(mutex
)
在臨界區之後執行v(mutex
)
例項:
semaphore mutex=1;
p1()p2
()
注意:
訊號量機制實現同步
程序同步:要讓各併發程序按要求有序地推進。步驟:
分析什麼地方需要實現"同步關係",即必須保證"一前一後"執行的兩個操作(或兩句**)。
設定同步訊號量s,初始為0。
在"前操作"後執行v(s)。
在"後操作"前執行p(s)。
例項:保證**4執行在**1和**2之後。
semaphore s=0;
p1()p2
()
上述**,若先執行到v(s)操作,則s++後s=1。之後當執行到p(s)操作時,由於s=1,表示有可用資源,會執行s–,s的值變為0,p2程序不會執行block原語,而是繼續往下執行**4。
若先執行到p(s)操作,由於s=0,s–後s=-1,表示此時沒有可用資源,因此p操作中會執行block原語,主動請求阻塞。之後當執行完**2,繼而執行v(s)操作,s++,使s變回0,由於此時有程序在該訊號量對應的阻塞佇列中,因此會在v操作中執行wakeup原語,喚醒p2程序進入就緒對列。
訊號量機制實現前驅關係
步驟:
要為每一對前驅關係各設定乙個同步變數
在"前操作"之後對相對應的同步變數執行v操作
在「後操作」之前對相對應同步變數執行p操作
前驅關係本質上是更複雜的同步問題。
生產者、消費者共享乙個初始為空、大小為n的緩衝區。只有緩衝區沒滿時,生產者才可以把產品放入緩衝區,否則必須等待。
只有緩衝區不為空時,消費者才可以從緩衝區取出產品,否則必須等待。
semaphore mutex=1;
semaphore empty=n;
semaphore full=0;
void
producer()
void
customer()
作業系統之 訊號量機制
訊號量機制是一種卓越成效的程序同步工具,訊號量機制已經被廣泛的使用於單處理機,和多處理系統的計算機網路中。訊號量s 是乙個整數,s大於等於零代表可供併發程序使用的資源實體數,當 s小於零時則表示正在等待使用臨界區的程序數,整型訊號量 整型訊號量定義乙個用於表示資源數目的整型量數目s 但是僅能通過兩個...
作業系統之訊號量機制
使用者程序可以使用作業系統提供的原語來操作訊號量,以實現程序的互斥和同步 原語是一塊不可中斷的程式段,由關中斷實現 這對原語是wait signal 又稱為p v操作 訊號量可分為整形訊號量記錄型訊號量 程序的互斥需要遵守 四個原則,空則讓進,忙則等待,有限等待,讓全等待 由圖可以看出,在進行p操作...
作業系統 訊號量機制
用乙個整數型的變數作為訊號量,用來表示股系統中某種資源的數量。與普通整數變數的區別 對訊號量的操作只有三種,初始化,p操作,v操作。p操作 相當於wait原語,進入區 v操作 signal原語,相當於退出區。大體實現 wait 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...