## 向題描述
假設一個系統有三個抽煙者進程和一個供應者進程。每個抽煙者不停地卷煙 并抽掉它,但是要卷起并抽掉一支煙,抽煙者需要有三種材料:煙草、紙和膠水。三個抽煙 者中,第一個擁有煙草、第二個擁有紙,第三個擁有膠水。供應者進程無限地提供三種材料, 供應者每次將兩種材料放到桌子上,擁有剩下那種材料的抽煙者卷一根煙并抽掉它,并給供 應者一個信號告訴完成了,供應者就會放另外兩種材料在桌上,這種過程一直重復(讓三個 抽煙者輪流地抽煙)。
## 問題分析
1) 關系分析。供應者與三個抽煙者分別是同步關系。由于供應者無法同時滿足兩個或 以上的抽煙者,三個抽煙者對抽煙這個動作互斥(或由三個抽煙者輪流抽煙得知
2) 整理思路。顯然這里有四個進程。供應者作為生產者向三個抽煙者提供材料。
3) 信號量設置。信號量offer1、offer2、offer3分別表示煙草和紙組合的資源、煙草和 膠水組合的資源、紙和膠水組合的資源。信號量finish用于互斥進行抽煙動作。
代碼如下:
```
int random; //存儲隨機數
semaphore offer1=0; //定義信號量對應煙草和紙組合的資源
semaphore offer2=0; //定義信號量對應煙草和膠水組合的資源
semaphore offer3=0; //定義信號量對應紙和膠水組合的資源
semaphore finish=0; //定義信號量表示抽煙是否完成
//供應者
while(1){
random = 任意一個整數隨機數;
random=random% 3;
if(random==0)
V(offerl) ; //提供煙草和紙
else if(random==l)
V(offer2); //提供煙草和膠水
else
V(offer3) //提供紙和膠水
// 任意兩種材料放在桌子上;
P(finish);
}
//擁有煙草者
while(1){
P (offer3);
// 拿紙和膠水,卷成煙,抽掉;
V(finish);
}
//擁有紙者
while(1){
P(offer2);
// 煙草和膠水,卷成煙,抽掉;
V(finish);
}
//擁有膠水者
while(1){
P(offer1);
// 拿煙草和紙,卷成煙,抽掉;
v(finish);
}
```
- 1. 操作系統概述
- 2.操作系統(計算機)進程和線程管理
- 2.1 進程的概念和特征
- 2.2 進程的狀態與轉換
- 2.3 進程控制
- 2.4 進程的組
- 2.5 進程的通信
- 2.6 線程的概念和多線程模型
- 2.7 處理機調度
- 2.8 操作系統典型調度算法
- 2.9 進程同步的基本概念
- 2.10 實現臨界區互斥的基本方法
- 2.11 信號量
- 2.12 管程:管程的定義、組成及基本特性
- 2.13 經典進程同步問題1
- 2.14 經典進程同步問題2:讀者-寫者問題
- 2.15經典進程同步問題3:哲學家進餐問題
- 2.16 經典進程同步問題4:吸煙者問題
- 2.17 死鎖的概念以及產生死鎖的原因
- 2.18 關于進程和線程的知識點匯總