操做系統-進程(8)-臨界區管理

1、軟件算法
peterson算法:爲每一個進程設置標誌inside[i],當標誌爲true時表示此進程要求進入臨界區;此外再設置指示器turn指示由哪一個進程進入臨界區
bool inside[2]; inside[0] = false; inside[1] = false; enum{0,1} turn; cobegin process p0() { inside[0] = true; //上鎖
    turn = 1; while(inside[1]&&turn==1); /*臨界區*/ inside[0] = false; } process P1() { inside[1] = true; turn = 0; while(inside[0]&&turn==0); /*臨界區*/ inside[1] = false; } coend
任意進程進入臨界區的條件:對方不想進入臨界區,且對方不在臨界區
所以,任何進程都可屢次進入臨界區,不會出現飢餓現象
 
2、硬件設施
(1)關中斷
進入臨界區時關中斷,隨後時鐘中斷、進程上下文切換等均被屏蔽,退出臨界區時開中斷
缺點:不適合做爲通用互斥機制,關中斷時間過長影響性能和系統效率,不適合多處理器系統,該權力賦予用戶過於危險
(2)測試並創建指令
一條不可分割的指令TS(&x)完成測試鎖、掛上鎖
bool TS(bool &x){ if(x){ x == false; return true; } else return false; } bool s = true; cobegin process Pi(){ while(!TS(s)); /*臨界區*/ s = true; //開鎖
} coned
(3)對換指令
每一個進程進入臨界區前先定義一個真值,與這把鎖進行交換
void SWAP(bool &a , bool &b){ bool temp = a; a = b; b = temp; } bool lock = false; cebegin process Pi(){ bool keyi = true; do{ SWAP(keyi , lock) }while(keyi); /*臨界區*/ SWAP(keyi , lock); } coend
缺點:指令在進入臨界區前會忙式等待
相關文章
相關標籤/搜索