臨界資源(critical resouce)
臨界區(critical section)
硬體同步機制
訊號量機制
訊號量的應用
管程3使用多道批處理系統不僅能有效的改善資源的利用率, 還可以顯著地提高系統的吞吐量, 但同時會使系統變得更加複雜,會使程式的執行結果存在不確定性。所以必須引入程序同步機制從而保證多個程式有條不紊的併發進行。
協調多個程序,使併發執行的程式之間按照一定規則共享系統資源,能夠很好的相互合作,從而時程式的執行具有可再現性。
間接相互制約關係
多個程式在併發執行,需要共享某些系統資源,如i/o,cpu等,導致這些併發執行的程式之間形成相互制約的關係。
例如印表機,磁帶機等資源, 必須保證多個程序只能互斥訪問。
直接相互制約關係
為了完成某些任務的兩個或多個程序之間的制約關係**於他們的合作。
例如a程式對緩衝區寫資料, b程式從緩衝區取資料
只允許互斥訪問的資源, 即同一時間內只允許乙個程序訪問的資源稱為臨界資源。
例如印表機,磁帶機等。
程序中訪問鄰接資源的**片段成為臨界區。每個程序互斥地進入自己的臨界區,則可實現對臨界的互斥訪問。
因此每個程序要進入臨界區時都應對臨界資源進行檢查,對應的**稱為進入區,進入臨界區後喲啊設定它正在被訪問的標誌,最後退出臨界區的後面要加上一段稱為退出區的**。其餘的**成為剩餘區。
while(ture)
同步機制應遵循的規則利用軟體方法解決同步問題有一定難度, 並且存在很大的侷限性,目前計算機多採用硬體指令來解決臨界區的問題
管理臨界區時可以將標誌看做乙個鎖, 鎖開進入,鎖關等待。
在進入測試鎖之前關閉中斷,直到執行玩臨界區釋放鎖後再開啟中斷。
由於獲取鎖的同時關閉了中斷,所以臨界區執行時不會被中斷,從而保證了臨界資源的互斥。
但代價很大,會嚴重影響系統的效率。且不適用於多核cpu。
借助一條硬體指令ts(test-and-set)實現互斥,ts指令的一般性描述如下:
boolean ts(boolean *lock)
這條指令可以看做是乙個原語, 即不可分割的.
使用ts管理臨界區時, 為每個臨界資源設定乙個布林變數lock, 當lock初值為false時表示該臨界資源空閒. 程式進入臨界區前用ts指令測試lock, 如果返回false表明沒有程序在臨界區內,可以進入, 並將lock賦值為true,等效於關閉了臨界資源.
利用ts指令實現互斥
dowhile(true);
該指令為對換指令, 用於交換兩個字的內容, 其處理過程如下.
void
swap
(boolean
*a,boolean
*b)
為每個臨界資源設定乙個全域性的布林變數lock, 初值為false, 在每個程序中利用乙個區域性變數key, 用swap指令實現互斥.
dowhile(key != false);
臨界區;
lock = false;
....
}while(true);
利用上述指令能夠實現程序的互斥, 但當臨界資源被占用時, 其他程序必須不斷的進行測試, 處於一種忙等的狀態, 不符合讓權等待原則. 造成cpu的浪費, 同時也很難將他們用於解決複雜的程序同步問題.
一種卓有成效的程序同步機制,現已經被廣泛應用於單處理機和多處理及系統及計算機網路中
定義乙個整形量s用來表示資源數目
s僅能通過兩個標準的原子操作wait(s)和signal(s)來訪問
wait
(s)signal
(s)
整型訊號量不符合讓權等待原則, 會使程序處於忙等狀態
所以在訊號量機制中, 需要乙個變數s代表資源數量外, 還需要乙個程序鍊錶指標鏈結所有等待的程序. 讓所有沒有獲取到資源的程序阻塞, 等待被喚醒.
該資料型別描述如下
typedef
struct
wait
(semephore *s)
signal
(semaphore *s)
程序進入臨界區前呼叫wait(s), 資源數量自減, 之後判斷資源數量是否小於0, 若小於0則將該程序阻塞block, 並將該程序鏈結在阻塞鍊錶後. 如果資源數量大於零則不阻塞程序, 讓其繼續執行
臨界區執行完後呼叫signal(s), 讓資源數量自增, 之後判斷你如果資源數量大於0, 則將等待煉表裡的第乙個程序喚醒, 如果資源數仍小於零, 則不執行喚醒操作.
由此可見, 該機制遵循了讓權等待準則, 如果設定s->value的初值為1, 則可實現對臨界資源的互斥訪問.
前面所述都是解決針對乙個資源的併發問題, 如果乙個程序要獲得兩個或兩個以上的資源才能進入臨界區的話, 則需要用到and型訊號量, 否則程序會有可能出現僵持狀態
例如
process a
wait
(x);
wait
(y);
process b
wait
(y);
wait
(x);
ab程序併發執行, 如果某一時刻a獲取到了x, 同時b獲取到了y, 此時a需要等待b的y釋放, 而b需要等待a的x釋放, 這時ab互不相讓陷入僵持狀態, 也稱這兩個程序死鎖.
and機制的思想為:
如果某乙個程序需要同時申請多個資源, 只有它一次性申請到所有資源後才能繼續執行, 執行完後將所有資源釋放, 如果該程序只申請到乙個資源, 則乙個資源也不給他. 這樣就可以避免上述死鎖的發生.
swait
(s1, s2,..
... sn)
else
}ssignal
(s1, s2,..
.. sn)
}
前面所述的wait(s)和signal(s)操作僅能對訊號量實施加一或減一操作, 意味著只能一次申請乙個si資源或釋放乙個si資源, 如果乙個程序一次需要n個si資源, 便要進行n次wait(s)操作, 這樣不但低效且不安全.
根據這點可以對and型訊號量進行擴充,對si分配下限值ti, 如果si小於ti則不予分配, 如果對於該資源的需求為di ,一旦分配則一次性分配di個si. 即si = si - di,
對應的函式**
swait
(s1,t1, d1, s2, t2, d2 ...
.. sn, tn, dn)
else
}ssignal
(s1, d1, s2, d2 ...
.. sn, dn)
}
將各程序訪問該資源的臨界區置於wait()和signal()之中, 為臨界資源設定乙個互斥訊號量mutex,值域(-1, 0 1) 並設定其初值為1, 當mutex = 1時表示沒有乙個程序進入臨界區, 當mutex = 0時表示有乙個程序進入臨界區, 等mutex = -1 時表示有乙個以上的程序進入臨界區.
semaphore mutex = 1;
pa()
}pb()
}
pa和pb同時while(true)實現併發互斥訪問資源.
注: wait(mutex)和signal(mutex)需要成對出現.
缺少wait()會導致系統混亂, 不能保證臨界資源的互斥訪問.
缺少signal()會導致臨界資源永不被釋放, 從而使阻塞的資源永不被喚醒
假設程式p1中有語句s1, 程式p2中有語句s2, 如果希望p1執行完s1後p2再執行s2的話, 可以利用訊號量的方法實現其前趨關係.
上圖所示前趨關係**實現描述.
p1()
p2()p3
()p4(
)p5()
p6()int
main()
訊號量雖然方便且有效, 但每個程序都需自備wait()和signal(), 這樣會使大量的同步操作分散在各個程序中. 會給系統的管理帶來麻煩, 並且會因為使用不當導致系統死鎖.
利用資料結構抽象表示系統中的共享資源的狀態和對資源的一些操作.
對於任意的共享資源程序必須通過管程來訪問和釋放.
管程包含了物件導向的思想, 他表徵了共享資源的資料結構和對其資料結構操作的一組過程, 包括同步機制,都集中並封裝在乙個物件內部, 內藏了內部實現.
管程的名稱
區域性與管程的共享資料說明
對該資料結構進行操作的一組過程
對區域性與管程的共享資料結構設定初始值的語句
語法描述
monitor monitor_name
voidp1(
....
)voidp1(
....
)}
作業系統 程序同步
引入程序 提高了資源的利用率和系統的吞吐量 程序的非同步性 會給系統造成混亂 程序同步基本概念 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...
作業系統 程序同步
生產者消費者問題 哲學家就餐 讀者寫著問題 銀行家演算法 程序同步是指在多道程式的環境下,存在著不同的制約關係,為了協調這種相互制約的關係,實現資源共享和程序協作,從而避免程序之間的衝突,進而引入程序同步。對於某些資源來說,在同一時間只能被乙個程序所占用,這些資源就被成為臨界資源。典型的臨界資源比如...