作業系統訊號量

2021-08-10 13:19:47 字數 1706 閱讀 1946

本文將針對較為簡單的生產者消費者問題,給出利用訊號量解決問題的方法。

生產者:能產生並投放資源的程序     

消費者:單純使用(消耗)資源的程序

問題表述: 一組

生產者程序和一

組消費者程序(設每組有多個程序)通過緩衝區發生聯絡。

生產者程序將生產的產品(資料、訊息等統稱為產品)送入緩衝區,消費者程序從中取出產品。

假定緩衝區共有n 個,

不妨把它們設想成乙個環形緩衝池。

它們應滿足同步條件:

①任一時刻所有生產者存放產品的單元數不能超過緩衝區的總容量(n)。

②所有消費者取出產品的總量不能超過所有生產者當前生產產品的總量。

設緩衝區的編號為0~n-1,in和out分別是生產者程序和消費者程序使用的指標,指向下面可用的緩衝區,初值都是0。

設定三個訊號量

full:表示放有產品的緩衝區數,其初值為0。

empty:表示可供使用的緩衝區數,其初值為n。

mutex:互斥訊號量,初值為1,表示各程序互斥進入臨界區,保證任何時候只有乙個程序使用緩衝區。

生產者程序producer

while(true) {           

p(empty);

p(mutex);     

產品送往buffer(in); 

in=(in+1)mod n;                      /*以

n為模*

/                                

v(mutex);    

v(full);  

消費者程序producer

while(true) {           

p(full);

p(mutex);     

產品被取走buffer(out); 

out=(out+1)mod n;                      /*以

n為模*

/                                

v(mutex);    

v(empty);  

應注意①在每個程式中必須先做p(mutex),後做v(mutex),二者要成對出現。

②對同步訊號量full和empty的p, v操作同樣必須成對出現,但它們分別位於不同的程式中。

③無論在生產者程序中還是在消費者程序中,兩個 

p 操作的次序不能顛倒 。

較大的疑惑在於③。

當消費者程序中的p(mutex)操作在先,p(full)操作在後,若先執行消費者程序,則mutex-1,為0,且full為0(乙個資源也沒有),則無法進入緩衝區獲得資源;同時,因為mutex為0,生產者程序無法進入緩衝區投放資源(無論生產者程序的兩個p操作順序如何),無法投放資源,則消費者程序無法往下執行,故而形成死鎖。

當生產者程序中的p(mutex)操作在先,p(full)操作在後,消費者程序中的p(full)操作在先,p(mutex)操作在後,若生產者程序往緩衝區投放資源,直至投滿緩衝區,且之後消費者程序剛完成p(full)操作,就被生產者搶了cpu,完成了p(mutex)操作,但此時由於緩衝區已滿,故無法再投放資源,而消費者程序則由於生產者進入了臨界區,故無法到臨界區取資源,也無法繼續往下執行,故而形成死鎖。

所以無論在生產者程序中還是在消費者程序中,兩個 

p 操作的次序不能顛倒 。

作業系統 訊號量

代表了一類物理資源,是相應的物理資源的抽象,通常為整型或結構體型,除了初始化之外,其他情況下只能使用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 方法一氣呵成,避免併發導致的問題。但是不滿足 讓權等待原則 程序會處於忙...

作業系統 訊號量 併發控制

0.基礎概念 程序同步 有邏輯的程序之間需要有一定的先後順序 程序互斥 程序之間對臨界資源的使用 1.產生背景 由於多個程序要使用臨界資源,必須對臨界資源進行管理 臨界資源是一次僅允許乙個程序使用的共享資源 每個程序中訪問臨界資源的那段程式稱為臨界區,或者叫臨界 2.關於pv操作 p,v原語的理論不...