问题描述:

假设一个系统有三个吸烟者进程和一个供应者进程,每个吸烟者都需要得到三个资源才能完成吸烟操作并且他们每人都持有这三种资源中的一种,供应者一次只能提供三种资源中两种的组合,并且要等到接收到吸烟者吸烟完成信号才能继续派发资源。

#include <iostream>
#include <stdlib.h>using namespace std;typedef struct semaphore {int random;//存储随机数,用于选择提供资源的类型int offer1;//对应烟草和纸的组合int offer2;//对应烟草和胶水的组合int offer3;//对应胶水和纸的组合int finish;//对应进程执行完毕后的应答
}*semaphoreptr;class Provider {
public:Provider() {}~Provider() {}int get_random();int get_finish(semaphoreptr s);void provide(semaphoreptr s,int a);
};
int Provider::get_random() {int n;n = rand() % 3 + 1;return n;
}
int Provider::get_finish(semaphoreptr s) {if (s->finish == 1) {//表示接收到吸烟者的成功执行确认return 1;}else {cout << "进程还没有执行完,不能派发下一个资源..." << endl;return 0;}
}
void Provider::provide(semaphoreptr s,int a) {if (s->finish == 1) {switch (a) {case 1:s->offer1 = 1;break;case 2:s->offer2 = 1;break;case 3:s->offer3 = 1;break;}return;}else {cout << "进程没有使用完资源,还不能派发新的资源..." << endl;return;}
}class Smoker {int num;int sign;
public:Smoker(int a):num(a),sign(0){}~Smoker(){}void wait(semaphoreptr s);void signal(semaphoreptr s);
};
void Smoker::wait(semaphoreptr s) {switch (this->num) {case 1:if (s->offer1 == 1) {//表示1号进程得到想要的资源this->sign = 1;//表示1号进程申请到资源break;}else {cout << this->num << "号进程没有申请到需要的资源..." << endl;break;}case 2:if (s->offer2 == 1) {//表示1号进程得到想要的资源this->sign = 1;//表示1号进程申请到资源break;}else {cout << this->num << "号进程没有申请到需要的资源..." << endl;break;}case 3:if (s->offer3 == 1) {//表示1号进程得到想要的资源this->sign = 1;//表示1号进程申请到资源break;}else {cout << this->num << "号吸烟者没有申请到需要的资源..." << endl;break;}}
}
void Smoker::signal(semaphoreptr s) {switch (this->num) {case 1:if (this->sign == 1) {cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;s->finish = 1;s->offer1 = 0;this->sign = 0;break;}else {cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;break;}case 2:if (this->sign == 1) {cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;s->finish = 1;s->offer2 = 0;this->sign = 0;break;}else {cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;break;}case 3:if (this->sign == 1) {cout << this->num << "号吸烟者得到资源开始吸烟..." << endl;s->finish = 1;s->offer3 = 0;this->sign = 0;break;}else {cout << this->num << "号吸烟者没有得到资源,不能吸烟..." << endl;break;}}
}int main()
{semaphoreptr s = (semaphore *)malloc(sizeof(semaphore));s->finish = 1;s->offer1 = 0;s->offer2 = 0;s->offer3 = 0;Provider p;Smoker s1(1), s2(2), s3(3);int n1,n2,n3;n1 = p.get_random();n2 = p.get_random();while (n2 == n1) {n2 = p.get_random();}n3 = 6 - n1 - n2;p.provide(s,n1);s1.wait(s);s2.wait(s);s3.wait(s);s1.signal(s);s2.signal(s);s3.signal(s);p.provide(s,n2);s1.wait(s);s2.wait(s);s3.wait(s);s1.signal(s);s2.signal(s);s3.signal(s);p.provide(s, n3);s1.wait(s);s2.wait(s);s3.wait(s);s1.signal(s);s2.signal(s);s3.signal(s);return 0;
}

调试结果:

参考书籍: 王道 《2018年操作系统考研复习指导》

操作系统进程调度算法——吸烟者问题相关推荐

  1. Java操作系统进程调度算法——时间片轮转(RR)算法

    Java操作系统进程调度算法--时间片轮转(RR)算法 文章目录 Java操作系统进程调度算法--时间片轮转(RR)算法 前言 一.算法思想 二.数据结构 1.定义PCB进程控制块 2.实现思路 三. ...

  2. Java操作系统进程调度算法——优先级调度(HPF)算法

    Java操作系统进程调度算法--优先级调度(HPF)算法 文章目录 Java操作系统进程调度算法--优先级调度(HPF)算法 前言 一.算法思想 二.数据结构 1.定义(PCB)进程控制块 2.实现思 ...

  3. 操作系统进程调度算法,进程调度实验

    操作系统进程调度算法 1 题目描述 1.1 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2 实验内容 编写并调试一个模拟的进程调度程序,采用简单时间片 ...

  4. Java操作系统进程调度算法——先来先服务(FCFS)算法

    Java操作系统进程调度算法--先来先服务(FCFS)算法 Java操作系统进程调度算法--先来先服务(FCFS)算法 文章目录 Java操作系统进程调度算法--先来先服务(FCFS)算法 前言 一. ...

  5. 操作系统学习(一):浅析操作系统进程调度算法

    目录 0.前置知识 0.1 调度性能指标 0.2 上下文切换 1.进程调度算法简单介绍 1.1 先进先出(FIFO) 1.2 最短任务优先(SJF) 1.3 最短完成时间优先(STCF) 1.4 轮转 ...

  6. 操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

    先来先服务算法(FCFS) FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度 这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短, 做法是从后备队列中选择几 ...

  7. OS / 几个常用的操作系统进程调度算法

    在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用.下面介绍几种常用的调度算法. 一.先来先服务(FCFS)调度算法 FCFS 调度算法是 ...

  8. 操作系统进程调度算法(FCFS、SJF、高响应比)

    进程调度算法(FCFS.SJF.高响应比) 一.算法描述 1.先来先服务(FCFS)调度算法 (1)FCFS是最简单的调度算法,该算法可用于作业调度,也可用于进程调度. (2)算法规则:系统按照作业到 ...

  9. 几个常用的操作系统进程调度算法

    一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度 ...

最新文章

  1. 29个你必须知道的Linux命令
  2. 2、已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列; * 他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直
  3. DBUtils使用详解
  4. SQL-4查找所有已经分配部门的员工的last_name和first_name(自然连接)
  5. 现代软件工程 团队博客作业 如何评价个人在团队中的绩效
  6. 什么是序列化?python pickle模块
  7. Vue3、TypeScript 实现图片数量及大小随宽度自适应调整
  8. 全国计算机等级考试题库二级C操作题100套(第97套)
  9. 一起动手打造个人娱乐级linux
  10. erlang监控树 supervisor
  11. spark学习-76-目标:如何成为大数据Spark高手
  12. ACL 2020投稿破 3 千,到底有多少人在做 NLP 研究?
  13. websocket连接相关的几个问题
  14. vcf通讯录转excel
  15. 动视暴雪消费产品集团首次亮相2018年中国授权展
  16. 计算机主板运算放大器电路,常用运算放大器电路图 (全集)
  17. SDNU-1014 页码问题
  18. 如何对CAD图纸上的图形进行单独保存起来
  19. 【单片机】用定时器以间隔500ms在8位数码管上依次显示0、1、2、3、...C、D、E、F,重复
  20. ffmpeg音频滤镜

热门文章

  1. 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation
  2. java ts流封装工具_从 Java 到 TS,阿里妈妈的接口管理一把梭
  3. 【VHDL语言学习笔记(二)】 4位向量加法器
  4. matlab regress 非线性,MATLAB用regress作多元非线性回归
  5. 福玛特机器人怎么开机_五一解放双手的选择 福玛特扫地机器人解救你
  6. RV32I 基本指令集汇编解析
  7. RV-LINK:将 GD32VF103C-START 开发板变成 RISCV-V 仿真器
  8. 上下文无关文法及其分析树
  9. img的title和alt区别
  10. 单片机c语言idata什么意思,单片机C语言中的data,idata,xdata,pdata,code