01 程序同步

2022-07-09 12:54:11 字數 4407 閱讀 1850

1、程序同步的背景

有乙個環形緩衝池,包含n個緩衝區(0~n-1)(如下圖所示:)。有兩類程序:一組生產者程序和一組消費者程序,生產者程序向空的緩衝區中放產品,消費者程序從滿的緩衝區中取走產品。

2、生產者程序:

while (true

)

3、消費者程序:

while (true

)s1: producer execute register1 = register1+1

s2: consumer execute register2 = count

s3: consumer execute register2=register2-1

s4: producer execute count = register1

s5: consumer execute count = register2

正確結果應該是: 「count = 5」 , 現在的結果是: 「count = 4

在多道程式環境下,這裡兩道程式,程序併發執行,不同程序存在相互制約的關係。為了協調該關係,避免程序衝突,引入了程序同步。

4、程序同步的概念:

臨界資源:一次僅允許乙個程序使用的資源稱為臨界資源。比如:印表機、共享變數等。

臨界區:是指併發程序中訪問臨界資源的程式段。

進入區:檢查是否可以進入臨界區,若可以,設定正在訪問臨界區標誌。

退出區:清除正在訪問臨界區標誌。

程序的互斥是指若干個程序要使用同一共享資源時,任何時刻最多允許乙個程序去使用,其它要使用該資源的程序必須等待,直到占有資源的程序釋放該資源。

程序的同步是解決程序間協作關係的手段。指乙個程序的執行依賴於另乙個程序的訊息,當乙個程序沒有得到來自於另乙個程序的訊息時則等待,直到訊息到達才被喚醒。

程序互斥關係是一種特殊的程序同步關係。

5、臨界區訪問原則:

互斥訪問– 若已有程序進入臨界區,則其他的程序必須等待其離開臨界區,釋放臨界資源。 (忙則等待)

前進– 若沒有程序處於其臨界區,應允許乙個請求進入臨界區的程序立即進入臨界區,訪問臨界資源。(空閒讓進)

有限等待– 對請求訪問的程序,應保證能在有限的時間內進入臨界區,避免進入「死等」。(避免死鎖問題)

讓權等待– 當程序不能進入臨界區時,該程序應釋放處理機,以免進入「忙等」狀態。

6、程序同步的實現方法-----軟體實現

在進入區設定和檢查一些標誌來標明是否有程序在臨界區,若有則在進入區迴圈檢查進行等待,程序在退出區修改標誌,以允許別的程序進入臨界區。

peterson 演算法

1981年,由peterson提出,滿足臨界區訪問的4原則。 設有兩個程序pi和pk,且loadstore指令是原子操作。pipk共享兩個變數:

intturn;

boolean flag[

2] ;

變數 turn:turn==i表示pi可進入其臨界區。

陣列 flag :

flag[i] = true表示程序pi請求進入臨界區!

pi程序:

while (true

)

pk程序:

while (true

)

pipk同時請求進入臨界區,while中的turn變數可保證只允許乙個進入臨界區,從而實現了互斥。考慮pi程序的**,flag[i] = true;意味著pi想進入臨界區,同時將turn設定為k, 若pk在臨界區,則piwhile條件為真,pi等待。若pk不在臨界區,則flag[k]falsepi進入臨界區,從而避免了死等。

7、程序同步的實現方法-----硬體方法

很多系統都提供了解決臨界區問題的硬體支援。 對於單處理器環境 – 「禁止中斷」 併發程序可以無缺省地執行 限制了交替執行程式的能力,執行效率明顯降低。 許多現代計算機系統提供了特殊的原子(執行該**時不允許被中斷)機器指令:

testandset指令:讀出標誌並把該標誌設定為true

swap指令:交換兩個記憶體字的內容。

8、訊號量

dijkstra發明了兩個訊號量操作原語:p操作原語和v操作原語。常用的其他符號有:waitsignalupdown等。 (原語是作業系統核心中執行時不可中斷的過程,即原子操作) 除賦初值外,訊號量僅能由同步原語對其進行操作,沒有任何其他方法可以檢查和操作訊號量。 利用訊號量和p、v操作既可以解決併發程序的競爭問題,又可以解決併發程序的協作問題。

整型訊號量:

記錄型訊號量:

實現同步:

實現互斥:

前驅圖:

//其他**

//其他**

經典同步問題有:生產者----消費者問題

讀者--寫者問題

哲學家進餐問題

程序同步(一) 程序同步相關概念

在os中引入程序後,雖然提高了資源的利用率和系統吞吐量,但是由於程序的非同步性將會給系統造成混亂,尤其是他們在爭搶臨界資源時。當多個程序去爭用共享變數 鍊錶時,可能導致資料處理出錯。程序同步的任務就是對多個相關程序在執行次序上進行協調,使得併發執行的程序之間能有效地共享資源和相互合作,從而使程式的執...

Linux程序同步

linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...

程序同步問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...