操作系统(二十五)吸烟者问题-单生产者多消费者问题
2.3.8 吸煙者問題-單生產(chǎn)者多消費(fèi)者問題
??假設(shè)一個(gè)系統(tǒng)有三個(gè)抽煙者進(jìn)程和一個(gè)供應(yīng)者進(jìn)程。每個(gè)抽煙者不停地卷煙并抽掉它,但是要卷起并抽掉一支煙,抽煙者需要有三種材料:煙草、紙和膠水。三個(gè)抽煙者中,第一個(gè)擁有煙草、第二個(gè)擁有紙、第三個(gè)擁有膠水。供應(yīng)者進(jìn)程無限地?供三種材料,供應(yīng)者每次將兩種材料放桌子上,擁有剩下那種材料的抽煙者卷一根煙并抽掉它,并給供應(yīng)者進(jìn)程一個(gè)信號(hào)告訴完成了,供應(yīng)者就會(huì)放另外兩種材料再桌上,這個(gè)過程一直重復(fù)(讓三個(gè)抽煙者輪流地抽煙)。
? 這也是一個(gè)生產(chǎn)者-消費(fèi)者問題,準(zhǔn)確的說是一個(gè)可生產(chǎn)多種產(chǎn)品的單生產(chǎn)者以及多消費(fèi)者問題。根據(jù)題意分析可得,生產(chǎn)者可生產(chǎn)的產(chǎn)品一共有三種:組合一:紙+膠水;組合二:煙草+膠水;組合三:煙草+紙。下面我們來分析一下本題目中包含的同步與互斥的關(guān)系:互斥關(guān)系:桌子可以看作是一個(gè)容量為1的緩沖區(qū),其訪問是互斥的;同步關(guān)系:桌上有組合一之后第一個(gè)抽煙者取走組合一;桌上有組合二之后第二個(gè)抽煙者取走組合二;桌上有組合三之后第三個(gè)抽煙者取走組合三;取走東西使用完成后供應(yīng)者將下一個(gè)組合放到桌子上。用前驅(qū)圖表示如下:
? 具體實(shí)現(xiàn)如下:
semaphore offer1 = 0; //桌上組合一的數(shù)量 semaphore offer2 = 0; //桌上組合二的數(shù)量 semaphore offer3 = 0; //桌上組合三的數(shù)量 semaphore finish = 0; //抽煙是否完成 semaphore mutex = 1; //實(shí)現(xiàn)互斥訪問桌子(實(shí)際上可以不用) int i = 0; //用于實(shí)現(xiàn)“三個(gè)抽煙者輪流抽煙”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);} }?
總結(jié)
以上是生活随笔為你收集整理的操作系统(二十五)吸烟者问题-单生产者多消费者问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统(二十四)多生产者多消费者问题
- 下一篇: 2021中国餐饮营销力白皮书