操作系统(二十五)吸烟者问题-单生产者多消费者问题
生活随笔
收集整理的這篇文章主要介紹了
操作系统(二十五)吸烟者问题-单生产者多消费者问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2.3.8 吸煙者問題-單生產者多消費者問題
??假設一個系統有三個抽煙者進程和一個供應者進程。每個抽煙者不停地卷煙并抽掉它,但是要卷起并抽掉一支煙,抽煙者需要有三種材料:煙草、紙和膠水。三個抽煙者中,第一個擁有煙草、第二個擁有紙、第三個擁有膠水。供應者進程無限地?供三種材料,供應者每次將兩種材料放桌子上,擁有剩下那種材料的抽煙者卷一根煙并抽掉它,并給供應者進程一個信號告訴完成了,供應者就會放另外兩種材料再桌上,這個過程一直重復(讓三個抽煙者輪流地抽煙)。
? 這也是一個生產者-消費者問題,準確的說是一個可生產多種產品的單生產者以及多消費者問題。根據題意分析可得,生產者可生產的產品一共有三種:組合一:紙+膠水;組合二:煙草+膠水;組合三:煙草+紙。下面我們來分析一下本題目中包含的同步與互斥的關系:互斥關系:桌子可以看作是一個容量為1的緩沖區,其訪問是互斥的;同步關系:桌上有組合一之后第一個抽煙者取走組合一;桌上有組合二之后第二個抽煙者取走組合二;桌上有組合三之后第三個抽煙者取走組合三;取走東西使用完成后供應者將下一個組合放到桌子上。用前驅圖表示如下:
? 具體實現如下:
semaphore offer1 = 0; //桌上組合一的數量 semaphore offer2 = 0; //桌上組合二的數量 semaphore offer3 = 0; //桌上組合三的數量 semaphore finish = 0; //抽煙是否完成 semaphore mutex = 1; //實現互斥訪問桌子(實際上可以不用) int i = 0; //用于實現“三個抽煙者輪流抽煙”provider (){while(1){if(i==0) {P(mutex);將組合一放桌上;V(mutex);V(offer1);} else if(i==1){P(mutex);將組合二放桌上;V(mutex);V(offer2);} else if(i==2){P(mutex);將組合三放桌上;V(mutex);V(offer3);}i = (i+1)%3;P(finish);} }smoker1 (){while(1){P(offer1);從桌上拿走組合一;卷煙;抽掉;V(finish);} }smoker2 (){while(1){P(offer2);從桌上拿走組合二;卷煙;抽掉;V(finish);} }smoker3 (){while(1){P(offer3);從桌上拿走組合三;卷煙;抽掉;V(finish);} }?
總結
以上是生活随笔為你收集整理的操作系统(二十五)吸烟者问题-单生产者多消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统(二十四)多生产者多消费者问题
- 下一篇: 操作系统(二十六)读者写者问题