程序互斥的軟體實現方法

2021-10-25 10:07:08 字數 1975 閱讀 7535

演算法思想:兩個程序在訪冋完臨界區後會把使用臨界區的許可權轉交給另乙個程序。也就是說每個程序進入臨界區的許可權只能被另乙個程序賦予

turn的初值為0,即剛開始只允許0號程序進入臨界區。

若p1先上處理機執行,則會一直卡在⑤。直到p1的時間片用完,發生排程,切換p0上處理機執行。

**①不會卡住p0,p0可以正常訪問臨界區,在p0訪問臨界區期間即時切換回p1,p1依然會卡在⑤。

只有p0在退出區將turn改為1後,p1才能進入臨界區。

因此,該演算法可以實現「同一時刻最多隻允許乙個程序訪問臨界區」

產生問題「:turn表示當前允許進入臨界區的程序號,而只有當前允許進入臨界區的程序在訪問了臨界區之後,才會修改turn的值。

也就是說,對於臨界區的訪問,一定是按p0→p1→p0→p1→……這樣輪流訪問。

這種必須「輪流訪問」帶來的問題是,如果此時允許進入臨界區的程序是p0,而p0一直不訪問臨界區,那麼雖然此時臨界區空閒,但是並不允許p1訪問。因此,單標誌法存在的主要問題是:違背「空閒讓進」原則。

演算法思想:設定乙個布林型陣列flag[ ],陣列中各個元素用來標記各程序想進入臨界區的意願,比如「fag[o]=ture」意味著0號程序p0現在想要進入臨界區。每個程序在進入臨界區之前先檢查當前有沒有別的程序想進入臨界區,如果沒有,則把自身對應的標誌flag設為true,之後開始訪問臨界區。

若按照①⑤②⑥③⑦…的順序執行,p0和p1將會同時訪問臨界區。

因此,雙標誌先檢查法的主要問題是:違反「忙則等待」原則。

原因在於,進入區的「檢查」和「上鎖」兩個處理不是一氣呵成的。「檢查」後,「上鎖」前可能發生程序切換。

演算法思想:雙標誌先檢查法的改版。前乙個演算法的問題是先「檢查」後「上鎖」,但是這兩個操作又無法一氣呵成,因此導致了兩個程序同時進入臨界區的問題。因此,人們又想到先「上鎖」後「檢查」的方法,來避免上述問題。

若按照①⑤②⑥…順序執行,p0和p1將都無法進入臨界區

因此,雙標誌後檢查法雖然解決了「忙則等待」的問題,但是又違背了「空閒讓進」和「有限等待」原則,會因各程序都長期無法訪問臨界資源而產生「飢餓」現象。

兩個程序都爭著想進入臨界區,但是誰也不讓誰,最後誰都無法進入臨界區。

演算法思想:雙標誌後檢查法中,兩個程序都爭著想進入臨界區,但是誰也不讓誰,最後誰都無法進入臨界區。 gary l. peterson想到了一種方法,如果雙方都爭著想進入臨界區,那可以讓程序嘗試「孔融讓梨」,主動讓對方先使用臨界區。

peterson演算法用軟體方法解決了程序互斥問題,遵循了空閒讓進、忙

則等待、有限等待三個原則,但是依然未遵循讓權等待的原則。

peterson演算法相較於之前三種軟體解決方案來說,是最好的,但依然不夠好。

程序互斥的軟體實現方法

1.單標誌法 缺點 turn 表示當前允許進入臨界區的程序號,而只有當前允許進入臨界區的程序在訪問了臨界區之後,才會修改turn的值。也就是說,對於臨界區的訪問,一定是p0 p1 p0 p1 這樣輪流訪問。這種必須 輪流訪問 帶來的問題是,如果此時允許進入臨界區的程序是p0,而p0一直不訪問臨界區,...

軟體方法實現互斥

一.單標誌法 輪流交替使用。缺點 當有乙個程序不再進入臨界區,便不能修改公共變數的turn,來標識另外乙個程序可以進入臨界區。因此另外乙個程序將永久不能進入臨界區,違背 空則讓進 的原則 a程序 while turn a critical section 臨界區 turn b remainder s...

linux Mutex實現程序間的互斥

在linux的ipc程序通訊中,semaphore是可以實現程序間共享互斥的,然而對於mutex,rwlock,spinlock預設的都是程序內的執行緒間的同步互斥 雖然也是process假裝的 本篇通過修改mutex預設屬性來實現程序間的mutex。pthread process private ...