作業系統 程序同步(三)

2021-07-27 22:54:05 字數 3478 閱讀 7918

程序同步中很著名的問題就是生產者-消費者問題,描述如下:

有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了乙個具有 n 個緩衝區的緩衝池,生產者程序將它所生產的產品放入乙個緩衝區中;消費者程序可從乙個緩衝區中取走產品去消費。儘管所有的生產者程序和消費者程序都是以非同步方式執行的,但它們之間必須保持同步,即不允許消費者程序到乙個空緩衝區去取產品,也不允許生產者程序向乙個已裝滿產品且尚未被取走的緩衝區中投放產品。

生產者-消費者問題**有很多種形式,但是面對的問題都是乙個:消費者程序和生產者程序在併發執行的時候,有乙個共享變數(假設為counter)若生產者對它做加 1 操作,消費者對它做減 1 操作,這兩個操作在用機器語言實現時, 常可用下面的形式描述:

register1:=counter; register2:=counter;

register1:=register1+1; register2:=register2 - 1;

counter:=register1; counter:=register2;

假設 counter 的當前值是 5。如果生產者程序先執行左列的三條機器語言語句,然後消費者程序再執行右列的三條語句,則最後共享變數counter 的值仍為 5; 反之,如果讓消費者程序先執行右列的三條語句,然後再讓生產者程序執行左列的三條語句,則 counter 值也還是 5,但是,如果按下述順序執行:

register1:=counter; (register1=5)

register1:=register1+1; (register1=6)

register2:=counter; (register2=5)

register2:=register2 - 1; (register2=4)

counter:=register1; (counter=6)

counter:=register2; (counter=4)

正確的 counter 值應當是 5,但現在是 4。

解決此問題的關鍵是應把變數 counter 作為臨界資源處理,亦即,令生產者程序和消費者程序互斥地訪問變數 counter。

同步機制的關鍵就是關於臨界區的互斥處理,這個互斥處理裡面的關鍵就是在臨界區外的程序不能夠阻止其他程序進入臨界區。具體的解決方式:

訊號量機制:

整型訊號量:整型訊號量定義為乙個用於表示資源數目的整型量 s,它與一般整型量不同,除初始化外,僅能通過兩個標準的原子操作(atomic operation) wait(s)和 signal(s)來訪問。很長時間以來,這兩個操作一直被分別稱為 p、v 操作。wait(s)和 signal(s)操作可描述為:

wait(s):

while s<=0 do no-op;

s:=s - 1;

signal(s): s:=s+1;

wait(s)是乙個原子操作,不能停下來,對s值的測試和做s:=s-1操作是都不能中斷。

記錄型型號量:在整型訊號量機制中的 wait 操作,只要是訊號量 s≤0,就會不斷地測試。因此,該機制並未遵循「讓權等待」的準則,而是使程序處於「忙等」的狀態。記錄型訊號量機制則

是一種不存在「忙等」現象的程序同步機制。但在採取了「讓權等待」的策略後,又會出現多個程序等待訪問同一臨界資源的情況。為此,在訊號量機制中,除了需要乙個用於代表資源數目的整型變數 value 外,還應增加乙個程序鍊錶指標 l,用於鏈結上述的所有等待程序。記錄型訊號量是由於它採用了記錄型的資料結構而得名的。它所包含的上述兩個資料項可描述為:

type semaphore=record

value: integer;

l: list of

process;

end

相應地,wait(s)和 signal(s)操作可描述為:

procedure

wait

(s)var

s:semaphore;

begin

s.value:=s.value-1;

if s.value<0

then

block(s.l);

endprocedure

signal

(s)var

s: semaphore;

begin

s.value:=s.value+1;

if s.value<=0

then wakeup(s.l);

end

s.value 的初值表示系統中某類資源的數目,因而又稱為資源訊號量。對它的每次 wait 操作,意味著程序請求乙個單位的該類資源,使系統中可供分配的該類資源數減少乙個,因此描述為s.value:=s.value-1;當 s.value<0 時,表示該類資源已分配完畢,因此程序應呼叫 block 原語,進行自我阻塞,放棄處理機,並插入到訊號量鍊錶s.l 中。可見,該機制遵循了「讓權等待」準則。此時 s.value 的絕對值表示在該訊號量鍊錶中已阻塞程序的數目。對訊號量的每次 signal 操作,表示執行程序釋放乙個單位資源,使系統中可供分配的該類資源數增加乙個,故 s.value:=s.value+1 操作表示資源數目加 1。若

加 1 後仍是 s.value≤0,則表示在該訊號量鍊錶中,仍有等待該資源的程序被阻塞,故還應呼叫 wakeup 原語,將 s.l 鍊錶中的第乙個等待程序喚醒。

and型訊號量:在有些應用場合,是乙個程序需要先獲得兩個或更多的共享資源後方能執行其任務。假定現有兩個程序 a和 b,他們都要求訪問共享資料 d 和 e。這種情況下很容易發生死鎖,解決方式就是「要麼不給,要麼全給」a要麼就是同時得到d和e,要麼就是d,e都得不到。

訊號量集:這是對and型訊號量進行的擴充,

swait 操作可描述如下,其中 s 為訊號量,d 為需求值,而 t 為下限值。

swait(s 1 ,t 1 ,d 1 ,…,s n ,t n ,d n )

if s i >=t 1

and … and s n >=t n then

for i:=1

to n do

s i :=s i - d i ;

endfor

else

place the executing process

inthe waiting queue of

thefirst s i with s i and

set its program counter

tothe beginning of

the swait operation.

endif

ssignal(s 1 ,d 1 ,…,s n ,d n )

for i:=1

to n do

s i :=s i +d i ;

remove all the

process waiting in

the queue associated with s i into

the ready queue

endfor;

作業系統 程序同步

臨界資源 critical resouce 臨界區 critical section 硬體同步機制 訊號量機制 訊號量的應用 管程3使用多道批處理系統不僅能有效的改善資源的利用率,還可以顯著地提高系統的吞吐量,但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保...

作業系統 程序同步

引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 1,兩種形式的制約關係 a 間接相互制約 ab兩程序爭用一台印表機 b 直接相互制約 a程序放資料 緩衝區 b程序從緩衝區取資料 2,臨界資源 硬體臨界資源 軟體臨界資源 印表機,磁帶機,緩衝區。3,臨界...

作業系統 程序同步

ipc.件 include include include include include include include define bufsz 256 建立或獲取 ipc 的一組函式的原型說明 int get ipc id char proc file,key t key char set s...