王道操作系统考研笔记——2.3.2 进程互斥的软件实现方法
文章目錄
- 2.3.2 進程互斥的軟件實現方法
- 2.3.2.1 單標志法
- 2.3.2.2 雙標志先檢查法
- 2.3.2.3 雙標志后檢查法
- 2.3.2.4 Peterson算法
- 2.3.2.5 小結
2.3.2 進程互斥的軟件實現方法
知識總覽
2.3.2.1 單標志法
單標志法的算法思想是:兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予。具體實現過程如下:
對于turn表示當前允許進入臨界區的進程號,而只有當前允許進入臨界區的進程在訪問了臨界區之后,才會修改turn的值。也就是說,對于臨界區的訪問,一定是按p0→p1→p0→p1…這樣輪流訪問。
這種必須輪流訪問帶來的問題是,如果此時允許進入臨界區的進程是P0,而P0一直不訪問臨界區,那么雖然此時臨界區空閑,但是并不允許P1訪問。因此對于單標志法,其違背了空閑讓進的原則。
2.3.2.2 雙標志先檢查法
雙標志先檢查法的算法思想是:設置一個布爾型數組flag[],數組中各個元素用來標記各進程想進入臨界區的意愿,比如flag[0] = true意味著0號進程p0現在想要進入臨界區。每個進程在進入臨界區之前先檢查當前有沒有別的進程想進入臨界區,如果沒有,則把自身對應的標志flag[i]設為true,之后開始訪問臨界區。
需要注意的是,如果按照152637的順序執行,p0和p1將會同時訪問臨界區。因此對于雙標志先檢查法,其違背了忙則等待的原則。
之所以造成這種問題,就是因為進入區的檢查和上鎖不是原子操作,在檢查完的下一步還沒上鎖很有可能發生其他事件。
2.3.2.3 雙標志后檢查法
既然在前一個算法中,原因出在先檢查后上鎖,那我們調換一下順序能否改變情況呢?
雙標志后檢查法的思想是:既然先檢查后上鎖不行,那我就先上鎖,然后在檢查。
需要注意的是,如果按照1526的順序執行,p0和p1將都無法進入臨界區。
因此雙標志后檢查法雖然解決了忙則等待的問題,但是又違背了空閑讓進和有限等待原則,因為如果各進程都長期無法訪問臨界資源會產生饑餓現象。
2.3.2.4 Peterson算法
在雙標志后檢查法中,兩個進程都爭著想進入臨界區,但是誰也不讓誰,既然這樣,那只需要有人禮讓即可解決問題。
如果按照123678的順序,則相當于串行執行,這種方式肯定可以執行。
如果按照162378的順序,那么進程0表明自己想進入臨界區,進程1表明自己想進入臨界區,回到2步驟,0進程表示愿意先讓給1進程執行,然后在檢查1也有意愿進入臨界區和自己已經讓位的情況下,自己處于等待狀態。這時候回到7步驟,1號進程也表示自己愿意先讓給0進程執行,然后在檢查0也有意愿進入臨界區和自己已經讓位的情況下,自己也處于等待狀態。此時回到步驟3,0號進程發現turn被修改為0了,說明自己可以不用等待讓位了,先行一步作為后回到步驟8,進程P1也順利做完了。
盡管Peterson算法用軟件方法解決了進程互斥問題,遵循了空閑讓進、忙則等待、有限等待三個原則,但是依然未遵循讓權等待原則。但是相較于前面三種算法,其本身已然是最好。
2.3.2.5 小結
總結
以上是生活随笔為你收集整理的王道操作系统考研笔记——2.3.2 进程互斥的软件实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java网站后台管理系统_java网站后
- 下一篇: Hibernate 逆向工程生成P