(考研)吸烟者问题(赋代码)

Posted 多情剑客无情剑;

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(考研)吸烟者问题(赋代码)相关的知识,希望对你有一定的参考价值。

向题描述

假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟 并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟 者中,第一个拥有烟草、第二个拥有纸,第三个拥有胶水。供应者进程无限地提供三种材料, 供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供 应者一个信号告诉完成了,供应者就会放另外两种材料在桌上,这种过程一直重复(让三个 抽烟者轮流地抽烟)。

 

问题分析

1) 关系分析。供应者与三个抽烟者分别是同步关系。由于供应者无法同时满足两个或 以上的抽烟者,三个抽烟者对抽烟这个动作互斥

2) 整理思路。显然这里有四个进程。供应者作为生产者向三个抽烟者提供材料。

3) 信号量设置。信号量offer1、offer2、offer3分别表示烟草和纸组合的资源、烟草和 胶水组合的资源、纸和胶水组合的资源。信号量finish用于互斥进行抽烟动作

 

int random; //存储随机数
semaphore offer1=0; //定义信号量对应烟草和纸组合的资源
semaphore offer2=0; //定义信号量对应烟草和胶水组合的资源
semaphore offer3=0; //定义信号量对应纸和胶水组合的资源
semaphore finish=0; //定义信号量表示抽烟是否完成,我的理解用01来表示互斥信号量

//供应者
process P0(){ while(1)
{ random
= 任意一个整数随机数; random=random% 3; if(random==0) V(offerl) ; //提供烟草和纸 else if(random==l) V(offer2); //提供烟草和胶水 else V(offer3) //提供纸和胶水 // 任意两种材料放在桌子上; P(finish);//若finish<0有|finish|个进程正在等待抽烟,从阻塞队列唤醒那个抽烟进程 }
}

//拥有烟草者
process p1(){ while(1)
{ P (offer3);
// 拿纸和胶水,卷成烟,抽掉; //将互斥使用这个权利交接出去
  V(finish);//大发现:若先执行生产者进程,执行到p(finish)这段代码的时候,会被阻塞
//因为刚放上去的东西还没被消费掉,必须v(finish)要先执行 }
}

//拥有纸者
process p2(){ while(1){ P(offer2); // 烟草和胶水,卷成烟,抽掉; V(finish); }
}

//拥有胶水者
process p3(){
while(1){ P(offer1); // 拿烟草和纸,卷成烟,抽掉; v(finish); }
}

 

以上是关于(考研)吸烟者问题(赋代码)的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

(王道408考研操作系统)第二章进程管理-第三节9:读者写者问题

操作系统王道考研 p22-26 生产者消费者问题多生产者多消费者问题吸烟者问题读者写者问题哲学家进餐问题

(王道408考研操作系统)第二章进程管理-第三节11:哲学家进餐问题

操作系统-进程PV操作——吸烟者问题

Python Seaborn swarmplot躲闪的顺序