1、程序同步的背景
有乙個環形緩衝池,包含n個緩衝區(0~n-1)(如下圖所示:)。有兩類程序:一組生產者程序和一組消費者程序,生產者程序向空的緩衝區中放產品,消費者程序從滿的緩衝區中取走產品。
2、生產者程序:
while (true3、消費者程序:)
while (true變數 turn:turn==i表示pi可進入其臨界區。)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,且load和store指令是原子操作。pi和pk共享兩個變數:
intturn;
boolean flag[
2] ;
陣列 flag :
flag[i] = true表示程序pi請求進入臨界區!
pi程序:
while (truepk程序:)
while (true若pi和pk同時請求進入臨界區,while中的turn變數可保證只允許乙個進入臨界區,從而實現了互斥。考慮pi程序的**,flag[i] = true;意味著pi想進入臨界區,同時將turn設定為k, 若pk在臨界區,則pi的while條件為真,pi等待。若pk不在臨界區,則flag[k]為false,pi進入臨界區,從而避免了死等。)
7、程序同步的實現方法-----硬體方法
很多系統都提供了解決臨界區問題的硬體支援。 對於單處理器環境 – 「禁止中斷」 併發程序可以無缺省地執行 限制了交替執行程式的能力,執行效率明顯降低。 許多現代計算機系統提供了特殊的原子(執行該**時不允許被中斷)機器指令:
testandset指令:讀出標誌並把該標誌設定為true。
swap指令:交換兩個記憶體字的內容。
8、訊號量
dijkstra發明了兩個訊號量操作原語:p操作原語和v操作原語。常用的其他符號有:wait和signal;up和down等。 (原語是作業系統核心中執行時不可中斷的過程,即原子操作) 除賦初值外,訊號量僅能由同步原語對其進行操作,沒有任何其他方法可以檢查和操作訊號量。 利用訊號量和p、v操作既可以解決併發程序的競爭問題,又可以解決併發程序的協作問題。
整型訊號量:
記錄型訊號量:
實現同步:
實現互斥:
前驅圖:
//其他**
//其他**
經典同步問題有:生產者----消費者問題
讀者--寫者問題
哲學家進餐問題
程序同步(一) 程序同步相關概念
在os中引入程序後,雖然提高了資源的利用率和系統吞吐量,但是由於程序的非同步性將會給系統造成混亂,尤其是他們在爭搶臨界資源時。當多個程序去爭用共享變數 鍊錶時,可能導致資料處理出錯。程序同步的任務就是對多個相關程序在執行次序上進行協調,使得併發執行的程序之間能有效地共享資源和相互合作,從而使程式的執...
Linux程序同步
linux程序同步 概述 程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號量 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是...
程序同步問題
有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...