經典程序同步與互斥問題

2021-08-20 19:39:06 字數 2369 閱讀 3804

1.1 簡單的「生產者-消費者」問題

設程序a、b是兩個相互合作的程序,它們共享乙個緩衝區,程序a向其中寫入資料,程序b從中讀出資料。producer:生產者程序,consumer:消費者程序。當緩衝區不空時,消費者便可以讀資料;當緩衝區為空時,生產者便可以寫資料。

設定訊號量:

full:表示有資料緩衝區的數目,初值為0;

empty:表示空緩衝區的數目,初值為1;

生產者:

do   while (true);
消費者:

do  while (true);
1.2 複雜的「「生產者-消費者」問題」

特點:

1. 若干程序通過有限的共享緩衝池交換資料。

2. 一組「生產者」程序不斷寫入,而一組「消費者」程序不斷讀出;

3. 任何時刻只能有乙個程序可對共享緩衝池進行操作

分析:

1. 消費者取資料時,緩衝池至少有乙個有資料的緩衝區

2. 生產者傳送資料時,緩衝池至少有乙個空緩衝區

3. 緩衝池是臨界資源,各個生產者和消費者之間必須互斥訪問

設定訊號量:

empty :表示空緩衝區個數,初值為n;

full :表示有資料的緩衝區個數,初值為0;

mutex :用來控制互斥的訪問緩衝區,初值為1;

生產者:

do   while (true);
消費者:

do  while (true);
在生產者—消費者問題中,不能將生產者程序的wait(empty)和wait(mutex)語句互換。因為生產者若是先拿到了mutex鎖,然後發現沒有空緩衝區,那麼就會一直等待,同時一直拿著mutex鎖。要注意到,mutex鎖是生產者和消費者共享的,此時生產者拿著鎖一直等待消費者消費,而消費者一直拿不到mutex鎖,則會造成死鎖。

一些程序唯讀資料,稱「讀者」;另一些會對資料進行修改,稱「寫者」。寫者與寫者互斥,寫者與讀者互斥;讀者之間不互斥。

對於寫程序而言:

1. 一定是互斥訪問。要保證寫者和讀者互斥,以及寫者和寫者互斥。

對於讀程序而言:

1. 如果是第1個讀者,要實現與寫者的互斥;如果是後繼讀者,則不需要。

2. 如果是最後乙個讀者,需要考慮喚醒阻塞的寫者,以便能夠讓寫者有機會進入臨界區。

設定訊號量:

wmutex :控制寫者互斥的訪問共享資料,初值為1;

readcount :讀者計數器,記錄當前讀者數,初值為0;

rmutex :控制讀者互斥訪問readcount,初值為1;

二者流程圖如下:

寫程序:

do  while (true);
讀程序:

do  while (true);
在讀程序讀的過程中,只需保證在對讀者數量變化時是互斥即可。

假設5個哲學家圍繞一張圓桌而坐,桌上放著5根筷子,哲學家進餐時需要同時拿起他左邊和右邊的兩根筷子。

思路一:

1. 對於每乙個哲學家,先等待左邊的筷子可用,然後等待右邊的筷子可用

2. 吃飯

3. 放下兩根筷子

do   while (true);
這樣勢必會導致乙個問題:在極端情況下,5個哲學家同時拿起左邊的筷子,那麼勢必會造成每個人都只有左筷子而沒有右筷子,每個人都在等待右筷子。造成死鎖現象。

解決死鎖問題的方法:

方法一:同時最多允許四個哲學家圍坐在桌子周圍。

方法二:只有在哲學家兩側的筷子都可用時才允許她撿起筷子。

思路二:

對於每乙個哲學家,要求同時拿起兩根筷子,要麼一根都不拿。

do   while (true);

經典程序同步與互斥問題

二 讀者與寫者問題 三 哲學家進餐過程 設定3個訊號量 mutex 1,full 0,empty n 假設緩衝池大小為n p empty p mutex 寫入資料 v mutex v full p full p mutex 讀取資料 v mutex v empty 乙個資料物件 如檔案 記錄 可以被...

程序同步與互斥

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

程序同步與互斥

為什麼要引入程序同步的概念?多道程式環境下的程序併發執行,它們相互之間存在著不同的制約關係,為了理解和協調這種制約的關係,引入了程序同步的概念。臨界資源是一次只能為乙個程序使用的資源。由於臨界資源的特性,就決定了 對它的訪問必須是互斥的。在每個程序中,訪問臨界資源的那段 稱為臨界區。為了保證臨界資源...