問題描述:使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。
因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。
為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使用兩個訊號量:empty 記錄空緩衝區的數量,full 記錄滿緩衝區的數量。其中,empty 訊號量是在生產者程序中使用,當 empty 不為 0 時,生產者才可以放入物品;full 訊號量是在消費者程序中使用,當 full 訊號量不為 0 時,消費者才可以取走物品。
注意,不能先對緩衝區進行加鎖,再測試訊號量。也就是說,不能先執行 down(mutex) 再執行 down(empty)。如果這麼做了,那麼可能會出現這種情況:生產者對緩衝區加鎖後,執行 down(empty) 操作,發現 empty = 0,此時生產者睡眠。消費者不能進入臨界區,因為生產者對緩衝區加鎖了,消費者就無法執行 up(empty) 操作,empty 永遠都為 0,導致生產者永遠等待下,不會釋放鎖,消費者因此也會永遠等待下去。
#define n 100
typedef
int semaphore;
semaphore mutex =1;
semaphore empty = n;
semaphore full =0;
void
producer()
}void
consumer()
}
允許多個程序同時對資料進行讀操作,但是不允許讀和寫以及寫和寫操作同時發生。
乙個整型變數 count 記錄在對資料進行讀操作的程序數量,乙個互斥量 count_mutex 用於對 count 加鎖,乙個互斥量 data_mutex 用於對讀寫的資料加鎖。
typedef
int semaphore;
semaphore count_mutex =1;
semaphore data_mutex =1;
int count =0;
void
writer()
}void
reader()
}
typedef
int semaphore;
semaphore count_mutex =1;
semaphore data_mutex =1;
semaphore write_mutex =1;
//實現寫者優先
int count =0;
void
writer()
}void
reader()
}
五個哲學家(a~e)圍著一張圓桌就餐,他們每個人面前都有一盤通心粉。由於通心粉很滑,所以需要兩隻筷子才能夾住,但每兩個盤子之間只放著乙隻筷子,如下圖。
哲學家只有兩個動作:要麼就餐,要麼思考。而且他們之間從不交談。
當乙個哲學家餓了的時候,就拿起盤子左右兩邊的筷子開始就餐(不能同時拿起兩隻筷子)。就餐完以後,就把筷子放回盤子左右,繼續思考。 由於他們之間互不交談,所以很容易出現「死鎖」:假如每個人都拿著左邊的筷子,則所有人都在等右邊的筷子,誰都吃不了。
為了防止死鎖的發生,可以設定兩個條件:
必須同時拿起左右兩根筷子;
只有在兩個鄰居都沒有進餐的情況下才允許進餐。
#define n 5
#define left (i + n - 1) % n
// 左鄰居
#define right (i + 1) % n
// 右鄰居
#define thinking 0
#define hungry 1
#define eating 2
typedef
int semaphore;
int state[n]
;// 跟蹤每個哲學家的狀態
semaphore mutex =1;
// 臨界區的互斥
semaphore s[n]
;// 每個哲學家乙個訊號量
void
philosopher
(int i)
}void
take_two
(int i)
void
put_two
(i)void
test
(i)}
作業系統之經典程序同步問題
2.哲學家進餐問題 3.讀者寫者問題 semaphore mutex 1 互斥訊號量,實現對緩衝區的互斥訪問 semaphore empty n 同步訊號量,表示空閒緩衝區的數量 semaphore full 0 同步訊號量,表示產品的數量 producer consumer semaphore m...
作業系統程序同步問題
一 臨界區 互相協作的程序之間有共享的資料,於是這裡就有乙個併發情況下,如何確保有序操作這些資料 維護一致性的問題,即程序同步。為了解決合作程序之間的競爭條件,引入臨界區問題模型。臨界區是包含訪問共享資料指令的相關 段,也是多個程序都包含的 段,在這段 中可能會進行更新資料表 交換變數等操作。從資料...
作業系統 程序同步問題
1 桌上有一空盤,允許存放乙隻水果。爸爸可向盤中放蘋果也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放乙隻水果供吃者取用,請用p v原語實現爸爸 兒子 女兒三個併發程序的同步。semaphore s 1,sa 0,so 0 main father son daug...