現代操作系統學習筆記-經典IPC問題

0.哲學家就餐問題

解法之一:

  • 有一個二元信號量用以避免操作的競態條件
  • 每個人有一個信號量用以標記所需叉子
  • 每個人有狀態 Thinking,Eating,Hungry
  • 一個人可以吃,需鄰居都不爲Eating
#define N   5
#define LEFT    (i+N-1)%N
#define RIGHT   (i+1)%N
#define Thinking    0
#define Eating 1
#define Hungry  2
void take_forks(int i)
{
    down(&mutex);
    state[i] = Hungry;
    test(i);
    up(&mutex);
    down(&s[i])
}
void put_forks(int i )
{
    down(&mutex);
    state[i] = Thinking;
    test(LEFT);
    test(RIGHT);
    up(&mutex);
}
void test(int i)
{
    if(state[i]==Hungry&&state[LEFT]!=Eating&&state[RIGHT]!=Eating){
        state[i]=Eating;
        up(&s[i]);
        }
}

1.讀者-寫者問題

思路1:

讀與寫共享二元信號量db,讀者獲得鎖時,讀者可持續進入,而寫獲得鎖時不可讀,當無讀者時釋放鎖。

  • 問題:某些讀者可能持續的進入,導致寫需要等待很久,甚至永遠不能寫

思路2:

同思路一,但當寫嘗試獲取鎖時,後續的讀請求將會掛起,而寫僅需等待目前未讀取完畢的任務。

  • 問題:併發和效率低
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章