作業系統 程序同步經典問題

2021-09-11 17:35:33 字數 2315 閱讀 5286

問題描述:使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。

因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 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...