程序的同步和互斥反映了 程序同步和互斥機制

2021-10-13 08:27:17 字數 2735 閱讀 6375

程序同步的幾種機制  **:

多程序的系統中避免不了程序間的相互關係。本講將介紹程序間的兩種主要關係——同步與互斥,然後著重講解解決程序同步的幾種機制。

程序互斥是程序之間發生的一種間接性作用,一般是程式不希望的。通常的情況是兩個或兩個以上的程序需要同時訪問某個共享變數。我們一般將發生能夠問共享變數的程式段稱為臨界區。兩個程序不能同時進入臨界區,否則就會導致資料的不一致,產生與時間有關的錯誤。解決互斥問題應該滿足互斥和公平兩個原則,即任意時刻只能允許乙個程序處於同一共享變數的臨界區,而且不能讓任一程序無限期地等待。互斥問題可以用硬體方法解決,我們不作展開;也可以用軟體方法,這將會在本講詳細介紹。

程序同步是程序之間直接的相互作用,是合作程序間有意識的行為,典型的例子是公共汽車上司機與售票員的合作。只有當售票員關門之後司機才能啟動車輛,只有司機停車之後售票員才能開車門。司機和售票員的行動需要一定的協調。同樣地,兩個程序之間有時也有這樣的依賴關係,因此我們也要有一定的同步機制保證它們的執行次序。

本講主要介紹以下四種同步和互斥機制:訊號量、管程、會合、分布式系統。

一,訊號量

理解pv:

pv操作由p操作原語和v操作原語組成(原語是不可中斷的過程),對訊號量進行操作,具體定義如下:

p(s):①將訊號量s的值減1,即s=s-1;

②如果s?0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。

v(s):①將訊號量s的值加1,即s=s+1;

②如果s>0,則該程序繼續執行;否則釋放佇列中第乙個等待訊號量的程序。

pv操作的意義:我們用訊號量及pv操作來實現程序的同步和互斥。pv操作屬於程序的低階通訊。

什麼是訊號量?訊號量(semaphore)的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。

一般來說,訊號量s?0時,s表示可用資源的數量。執行一次p操作意味著請求分配乙個單位資源,因此s的值減1;當s<0時,表示已經沒有可用資源,請求者必須等待別的程序釋放該類資源,它才能執行下去。而執行乙個v操作意味著釋放乙個單位資源,因此s的值加1;若s?0,表示有某些程序正在等待該資源,因此要喚醒乙個等待狀態的程序,使之執行下去。

利用訊號量和pv操作實現程序互斥的一般模型是:

程序p1              程序p2           ……          程序pn

p(s);              p(s);                         p(s);

臨界區;             臨界區;                        臨界區;

v(s);              v(s);                        v(s);

其中訊號量s用於互斥,初值為1。

使用pv操作實現程序互斥時應該注意的是:

(1)每個程式中使用者實現互斥的p、v操作必須成對出現,先做p操作,進臨界區,後做v操作,出臨界區。若有多個分支,要認真檢查其成對性。

(2)p、v操作應分別緊靠臨界區的頭尾部,臨界區的**應盡可能短,不能有死迴圈。

(3)互斥訊號量的初值一般為1。

利用訊號量和pv操作實現程序同步

pv操作是典型的同步機制之一。用乙個訊號量與乙個訊息聯絡起來,當訊號量的值為0時,表示期望的訊息尚未產生;當訊號量的值非0時,表示期望的訊息已經存在。用pv操作實現程序同步時,呼叫p操作測試訊息是否到達,呼叫v操作傳送訊息。

使用pv操作實現程序同步時應該注意的是:

(1)分析程序間的制約關係,確定訊號量種類。在保持程序間有正確的同步關係情況下,哪個程序先執行,哪些程序後執行,彼此間通過什麼資源(訊號量)進行協調,從而明確要設定哪些訊號量。

(2)訊號量的初值與相應資源的數量有關,也與p、v操作在程式****現的位置有關。

(3)同一訊號量的p、v操作要成對出現,但它們分別在不同的程序**中。

【例1】生產者-消費者問題

在多道程式環境下,程序同步是乙個十分重要又令人感興趣的問題,而生產者-消費者問題是其中乙個有代表性的程序同步問題。下面我們給出了各種情況下的生產者-消費者問題,深入地分析和透徹地理解這個例子,對於全面解決作業系統內的同步、互斥問題將有很大幫助。

(1)乙個生產者,乙個消費者,公用乙個緩衝區。

定義兩個同步訊號量:

empty——表示緩衝區是否為空,初值為1。

full——表示緩衝區中是否為滿,初值為0。

生產者程序

while(true) semaphore;

wait()訊號量部分**如下:

wait(semaphore *s)  while(true);

二、the readers-writers problem:

wrt初始化為1,readcount初始化為0,mutex為1

寫者操作:

do while(true);

讀者操作:

do while(true);

三、the dining-philosophers problem:

所有的chopstick[5]全部初始化為1

do while(true);

但是這個解決方案的最大問題在於它會出現死鎖。所以我認為應該增加乙個訊號量mutex,並初始化為1:

do while(true);

這樣由於確保了一位哲學家在拿起兩隻筷子的時間內其他哲學家不可以拿起任何一支筷子,從而破壞了死鎖出現需要的四個特徵中的hold and wait特徵,從而避免了死鎖的發生。

程序同步 程序互斥

並行性帶來了非同步性,有時需要通過程序同步解決這種非同步問題 有的程序之間需要互相配合地完成工作,各程序的工作推進需要遵循一定的先後順序 1.對臨界資源的訪問,需要互斥的進行。即同一時間內只能允許乙個程序訪問該資源 2.四個部分 進入區 檢查是否可進入臨界區,若可進入,需要 上鎖 臨界區 訪問臨界資...

程序同步與互斥

程序同步與互斥 首先,我們看乙個例子 程序p1 p2公用乙個變數count,初始值為0 p1 p2兩個程序的執行順序是隨機的,p1 p2可能順序執行或交錯執行。由圖可見,不同的執行順序,count值會不同,這是不允許的。在多道程式系統中,由於資源共享或程序合作,使程序間形成間接相互制約和直接相互制約...

程序同步 互斥量

程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread mutex init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。pthread mutexattr tmattr 型別 用於定義mutex鎖的 屬性 int pthread mutexattr init ...