程序同步機制的主要任務,是對多個相關程序在執行次序上進行協調,使併發執行的程序之間能夠按照一定的規則共享系統資源,並且很好地相互合作,從而使程式的執行具有可再現性。
一.兩種形式之間的制約關係
由於共享資源或者為完成某一任務相互合作,而產生制約關係
1.間接相互制約關係
多個程式在併發執行時,由於共享系統資源導致這些併發執行程式之間形成的相互制約關係。例如印表機這些臨界資源
2.直接相互制約關係
通過合作而產生的制約關係。例如只有a執行過後,b才能執行。而兩者都是為了完成某乙個功能。
臨界資源
只能乙個程序訪問的資源。程序之間採取互斥方式,實現對這種資源的共享。通過生產者—消費者問題(程序同步問題)可說明這一過程。 (具體不再說明該問題) 。
二.臨界資源
一次僅允許乙個程序使用的共享資源
三.臨界區
每個程序中訪問臨界資源的那段**稱為臨界區。可把乙個訪問臨界資源的迴圈程序描述如下:
while(true)
四.同步機制應遵循的規則
空閒讓進
忙則等待
有限等待
讓權等待:當程序不能進入自己的臨界區時,應立即釋放處理機,以免程序陷入忙等狀態。
訊號量機制是一種卓有成效的程序同步工具
訊號量的值只能由原語來改變
一·整形訊號量機制
wait(s)
signal(s)
又稱wait(s)和signal(s)為p,v操作,為原子操作,在執行時不可中斷。
wait操作中,只要訊號量s<=0,就會不斷地測試。因此,該機制並未遵循「讓權等待」 的準則,而是使程序處於「忙等」的狀態。
二·記錄型訊號量
記錄型訊號量是不存在「忙等」現象的程序同步機制。除了需要乙個用於代表資源數目的整型變數value外,再增加乙個程序鍊錶l,用於鏈結所有等待該資源的程序,記錄型訊號量是由於釆用了記錄型的資料結構得名。記錄型訊號量可描述為:
typedef struct semaphore;
相應的wait(s)和signal(s)的操作如下:
void wait (semaphore s)
}wait操作,s.value–,表示程序請求乙個該類資源,當s.value<0時,表示該類資源已分配完畢,因此程序應呼叫block原語,進行自我阻塞,放棄處理機,並插入到該類資源的等待佇列s.l中,可見該機制遵循了「讓權等待」的準則。
void signal (semaphore s)
}signal操作,表示程序釋放乙個資源,使系統中可供分配的該類資源數增1,故s.value++。若加1後仍是s.value<=0,則表示在s.l中仍有等待該資源的程序被阻塞,故還應呼叫wakeup 原語,將s.l中的第乙個等待程序喚醒。
s>=0 表示當前可用資源的數目
s<0 表示阻塞程序的個數
三.and型訊號量
and同步機制的基本思想是:將程序在整個執行過程中所需要的所有資源,一次性全部的分配給程序,帶程序使用完後再一起釋放。
and型訊號量適用於程序需要乙個或多個資源時。
**四.訊號量集
**在記錄型訊號量機制中,wait和signal操作只能進行加一減一的操作。當需要一次性需要申請n個同類資源時,需要進行n次操作,這顯然是低效的。為方便對資源的控制,每種資源在分配前需要檢查其數量是否在其極限值之上。為此,對and訊號量進行擴充。s為訊號量,d為需求量,t為下限值,對應的swait和ssignal格式為:
swait(s1,t1,d1,…,sn,tn,dn);
ssignal(s1,d1,…,sn,dn);
訊號量的互斥同步
訊號量的互斥同步都是通過pv原語來操作的,我們可以通過註冊兩個訊號量,讓它們在互斥的問題上互動,從而達到同步。通過下面例項就可以很容易理解 include include include include include include define return if fail p if p typ...
訊號量實現多程序的同步訪問
comm.h檔案 ifndef comm h define comm h include include include include include include include define pathname define proj id 06666 typedef union semun ...
訊號量的互斥與同步
一 訊號量互斥 公示欄問題 同學a在公示欄上寫 數學課取消 同學b然後又寫了 英語課考試 但是當,同學a寫下 數學課 後。出去了一下,這是同學b寫了 英語課考試 同學a再回來寫 取消 這時我們所要傳達的意思就完全不一樣了。所以需要引入互斥。1.訊號量 訊號量 又名 訊號燈 與其他進 程間通訊方式不大...