操作系统(十九)进程互斥的软件实现方法
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.1 單標志法
??兩個進程在訪問完臨界區后會把使用臨界區的權限轉交給另一個進程。也就是說每個進程進入臨界區的權限只能被另一個進程賦予
int turn = 0; //turn表示當前運行的進程編號P0進程 P1進程 while(turn != 0); 1 while(turn != 1); 5 //進入區 critical section; 2 critical section; 6 //臨界區 turn = 1; 3 turn = 0; 7 //退出區 remainder section; 4 remainder section; 8 //剩余區? 在這里turn就是一個標志,表示的是"讓步"。turn 的初值為 0,即剛開始只允許 0 號進程進入臨界區。若 P1 先上處理機運行,則會一直卡在 5。直到 P1 的時間片用完,發生調度,切換 P0 上處理機運行。代碼1(注意這個while后面是個分號表示此語句已完成而不是一個循環語句) 不會卡住 P0,P0 可以正常訪問臨界區,在 P0 訪問臨界區期間即時切換回 P1,P1依然會卡在 5。只有 P0 在退出區將 turn 改為 1 后,P1才能進入臨界區。
? 我們仔細手動推演一下代碼不難發現,此時進程調度是按P0 P1 P0 P1...輪流交替調度的,雖然可以實現互斥,但是如果在P0允許進入臨界區時,P0卻不想訪問臨界資源,那么處理機就會空閑此時P1去不能夠進行訪問,所以,這種方法不滿足”空閑讓進“原則。
2.3.2.2 雙標志先檢查法
??設置一個布爾型數組 flag[],數組中各個元素用來標記各進程想進入臨界區的意愿,比如“flag[0] = ture”意味著 0 號進程 P0 現在想要進入臨界區。每個進程在進入臨界區之前先檢查當前有沒有別的進程想進入臨界區,如果沒有,則把自身對應的標志 flag[i] 設為 true,之后開始訪問臨界區。
bool flag[2]; flag[0] = flash; flag[1] = flash;P0: P1: while(flag[1]); 1 while(flag[0]); 6 flag[0] = true; 2 flag[1] = true; 7 critical section; 3 critical section; 8 flag[0] = flash; 4 flag[1] = flash; 9 remainder section; 5 remainder section; 10? 當P0進程開始運行時,首先檢查P1的flag[1]=flash于是開始訪問臨界區,在訪問結束后將自身的flag[0]重新置為flash。這樣的數組flag實際上表示的是想要訪問資源的請求。雖然這樣進程不會交替進行執行但是如果先執行語句1再執行語句6那么P0與P1會同時進入臨界區,這就違反了“忙則等待”的原則。發生這種問題的原因是檢查上鎖過程的原子性被打破,如果檢查上鎖一氣呵成就不會出現這種問題。
2.3.2.3 雙標志后檢查法
? 雙標志先檢查法是先檢查后上鎖,但是這樣會導致兩個進程同時進入臨界區的問題,于是人們想到了先上鎖后檢查。
bool flag[2]; flag[0] = flash; flag[1] = flash;P0: P1: flag[0] = true; 1 flag[1] = true; 6 while(flag[1]); 2 while(flag[0]); 7 critical section; 3 critical section; 8 flag[0] = flash; 4 flag[1] = flash; 9 remainder section; 5 remainder section; 10? 雖然這樣的確可以解決忙則等待的問題,但如果1 5 2 6來執行程序,P0,P1都會進不了臨界區,又不滿足“空閑讓進”以及“有限等待”的原則。
2.3.2.4 Peterson法
??結合雙標志法、單標志法的思想。如果雙方都爭著想進入臨界區,那可以讓進程嘗試“孔融讓梨”(先客氣客氣)。
bool flag[2]; int turn = 0; flag[0] = flash; flag[1] = flash;P0: P1: flag[0] = true; 1 flag[1] = true; 7 turn = 1; 2 turn = 0; 8 while(flag[1] && turn==1); 3 while(flag[0] && turn==0); 9 critical section; 4 critical section; 10 flag[0] = flash; 5 flag[1] = flash; 11 remainder section; 6 remainder section; 12語句1:自己主動爭取資源使用權
語句2:把資源使用權謙讓給別人
語句3:如果對方想使用資源且確實是自己最后謙讓了就把資源給別人使用
語句4:訪問臨界區
語句5:解鎖
在這樣的算法之下不管以何種順序執行程序(1 2 3?7 8 9等),都不會違反空閑讓進、忙則等待以及有限等待的原則,但是仍未解決讓權等待的問題。
總結
以上是生活随笔為你收集整理的操作系统(十九)进程互斥的软件实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年中国少儿编程行业报告
- 下一篇: 开发到底喜欢看怎样的需求文档