1. 问题描述

设自行车生产线上有一只箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮,又设有三名工人,其活动分别为:
2. 问题分析(包括涉及的知识点、制约关系分析、问题的解决思路等)

​ 根据题目意义分析,该题所述作业工人1、工人2与工人3构成生产者与消费者关系,存在着生产者-消费者问题的同步关系,涉及的知识点包括:信号量、PV原语、进程同步、死锁问题等。

​ 问题解决思路:

​ 用信号量与PV操作实现三个工人的合作,首先不考虑死锁问题,工人1与工人3、工人2与工人3构成生产者与消费者关系,这两对生产-消费关系通过共同的缓冲区——箱子相联系。从资源的角度来看,箱子中的空位置相当于工人1和工人2的资源,而车架和车轮相当于工人3的资源。定义三个信号量empty(空位置数量)、frame(车架数量)、wheel(车轮数量)来实现这种同步关系,分析会产生什么问题:

semaphore empty = N;//空位置数量
semaphore frame = 0;//车架数量
semaphore wheel = 0;//车轮数量do{ //工人1活动
P(empty);
加工一个车架;
车架放入箱中;
V(frame);
}while(1)do{ //工人2活动
P(empty);
加工一个车轮;
车轮放入箱中;
V(wheel);
}while(1)do{ //工人3活动
P(frame);
P(wheel);
P(wheel);
箱中取一个车架;
箱中取一个车架;
组装一台车;
V(empty);
V(empty);
V(empty);
}while(1)

​ 分析易见,当工人1加工速度较快时,箱中空位置可能完全被车架占满或只留有一个存放车轮的位置,而当此时工人3同时取2个车轮时将无法得到,而工人2又无法将新加工的车轮放入箱中;当工人2加工速度较快时,箱中空位置可能完全被车轮占满,而当此时工人3取车架时将无法得到,而工人1又无法将新加工的车架放入箱中。上述两种情况都意味着死锁的发生。为防止死锁的发生,箱中车架的数量不可超过N-2,车轮的数量不可超过N-1,这些限制可以添加另外两个信号量maxframe(箱中最大车架数)、maxwheel(箱中最大车轮数)来解死锁产生问题,解决方案如下。

3. 解决方案(包括所用工具介绍、方案流程图、方案伪代码等)

方案伪代码如下:

semaphore empty = N;//空位置数量
semaphore maxframe = N-2;//箱中最大车架数量
semaphore maxwheel = N-1;//箱中最大车轮数量
semaphore frame = 0;//车架数量
semaphore wheel = 0;//车轮数量do{ //工人1活动P(maxframe);
P(empty);
加工一个车架;
车架放入箱中;
V(frame);
}while(1)do{ //工人2活动P(maxwheel);
P(empty);
加工一个车轮;
车轮放入箱中;
V(wheel);
}while(1)do{ //工人3活动
P(frame);
P(wheel);
P(wheel);
箱中取一个车架;
箱中取一个车架;
组装一台车;
V(maxframe);
V(maxwheel);
V(maxwheel);
V(empty);
V(empty);
V(empty);
}while(1)

工具介绍:



所用工具为jBACI,该工具包有自己的编译器和解释器,源代码有编译器编译,再解释执行,类似于java,该工具可以在windows10系统下直接运行。程序编写有“.cm”和“.pm”两种格式,“.cm”格式和C语言、C++相似,内置一些图形函数,具体可以参照docs文件夹下的说明书和examples文件夹下的范例来学习使用,使用前需要更改内部配置文件config.cfg文件,修改内容为:

SOURCE_DIRECTORY=.\examples\

PASCAL_COMPILER=.\bin\bapas.exe

C_COMPILER=.\bin\bacc.exe

(下载地址:https://github.com/motib/jbaci)

代码编写好后,需要点击Compile进行编译,才能够点击Run执行,进入执行页面可以看到有代码执行区、控制台、全局变量区等,可以对代码Add添加断点,可以step单步执行,点击Go执行后还可以很好看清各个进程的详细执行情况和各个变量的数值变化。

总之,jBACI是用来学习计算机操作系统进程同步与互斥制约关系的一个相当友好而且实用的工具。

方案示意流程图如下:

方案具体实现代码如下:

const int ValueOfCars = 50;//设定生产车的数量期望值int sumframe = 0;//用于计数生产车架的数量int sumwheel = 0;//用于计数生产车轮的数量int sumcar = 0;//用于计数生产车的数量semaphore empty = 6;//信号量:为了易于程序实现,设置位置N=6semaphore maxframe = 4;//信号量:为了防止死锁产生,箱中最大可容纳的车架数semaphore maxwheel = 5;//信号量:为了防止死锁产生,箱中最大可容纳的车轮数semaphore frame = 0;//信号量:车架数初始值=0semaphore wheel = 0;//信号量:车轮数初始值=0void worker1() {while (sumframe < ValueOfCars) {//为了防止死锁,给工人1一个停止条件wait(maxframe);wait(empty);sumframe = sumframe + 1;cout << "Worker1 is working  " << endl;signal(frame);}cout << "Worker1 have finished work  " << endl;//工人1工作结束}void worker2() {while (sumwheel < 2*ValueOfCars) {//为了防止死锁,给工人2一个停止条件wait(maxwheel);wait(empty);sumwheel = sumwheel + 1;cout << "Worker2 is working  "<< endl;signal(wheel);}cout << "Worker2 have finished work  " << endl;//工人2工作结束}void worker3() {while (sumcar < ValueOfCars) {//为了防止死锁,给工人3一个停止条件wait(frame);wait(wheel);wait(wheel);sumcar = sumcar + 1;cout << "Worker3 is working  "<< endl;signal(maxframe);signal(maxwheel);signal(maxwheel);signal(empty);signal(empty);signal(empty);}cout << "Worker3 have finished work  " << endl;//工人3工作结束}void main() {cobegin { worker1(); worker2();worker3();}cout << "Sumframe = " << sumframe << endl;//输出生产的车架总数cout << "Sumwheel = " << sumwheel << endl;//输出生产的车轮总数cout << "Sumcar = " << sumcar << endl;//输出生产的车总数}

4.实验结果分析(包括结果展示、结果原因剖析等)

结果展示:

​ 左边结果显示,工人1率先停下工作,工人2其次,工人3最后完成工作,右边结果显示,箱中车架数frame和车轮数wheel为0,箱中空位置数empty复位为6,最大可容纳车架数maxframe和最大可容纳车轮数maxwheel复位,生产出的车架数、车轮数、车辆数正好达到所设期望值,不超出也没减少,而且程序执行过程中并没有发出“A deadlock occured”的死锁警告。

结果原因剖析:

​ 该结果符合预期,成功避免了死锁发生。原因一是新添了两个信号量最大可容纳车架数maxframe和最大可容纳车轮数maxwheel,阻止了生产中出现的工人1或2加工过快导致箱中无法凑齐一辆车必要部件的死锁情况,原因二是通过设置生产车量的期望值来给每个工人一个工作结束条件,避免了工人1或2其中一个率先结束工作时工人3未结束工作但因一个部件缺少而一直等待,另一工人也等待工人3拿走箱中部件才能继续加工的死锁情况。

计算机操作系统专题一:多道环境下进程同步与互斥制约关系的学习相关推荐

  1. 云计算机教室课堂教学设计方案,专题十 多媒体教室环境下的课堂教学设计

    专题十 多媒体教室环境下的课堂教学设计 多媒体教室是一种典型的信息化教学环境,由于其集成了多种媒体设备,丰富了教学手段,因此有效地应用多媒体教室,可以使教学内容以多种方式呈现,既能将抽象的事物具体化, ...

  2. 《大数据》专题征文:国产环境下的大数据处理系统

    点击上方蓝字关注我们 <大数据>专题征文:国产环境下的大数据处理系统 (截稿时间:2021年5月31日) 目前,我国在一些前沿领域开始进入并跑.领跑阶段,但仍然面临很多"卡脖子& ...

  3. 操作系统课程设计--在Linux环境下模拟实现简单命令解释器(C++代码)

    操作系统课程设计要求 一.设计目的 熟悉Linux编程环境,加强对Linux命令的理解及函数的运用 二.设计内容 1. 在Linux环境下模拟实现简单命令解释器. (1)要求实现的基本命令包括: pw ...

  4. 计算机专业英语+贾任,网络环境下的高职英语教学_网络与高职英语教学的整合_贾泽军...

    样教师可快速.准确地了解学生学习情况,帮助学生提高学习效率. 2 传统英语教学下的学生的现状 我国缺少英语语言环境,传统的英语课堂教学是一种学生集中在教室里听老师的讲授与辅导的教学模式,学校和教室构成 ...

  5. 操作系统:第二章 进程管理3 - 进程同步与互斥

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  6. 怎么禁用域控下的计算机配置,怎样从Windows域环境下禁用USB口设备

    我们来详解一下Windows识别USB设备主要通过两个文件,一个是Usbstor.pnf.另外一个是Usbstor.inf,当在电脑第一次使用USB设备之前禁用这两个文件即可达到我们的目标. 1.打开 ...

  7. 域用户不准更改计算机名,请教高手,域环境下如何不退域修改计算机名?

    客户端计算机名命名不规范需重新命名,大量计算机若手动退域再加域进行命名工作量非常大,不知有没有好的方法解决这个问题.因为碰不到服务器,所以最好是能在客户端机器上操作修改.网上搜到说通过修改注册表可以, ...

  8. Python下进程同步之互斥锁、信号量、事件机制

    链接:https://blog.csdn.net/qq_41964425/article/details/81911343

  9. 计算机操作系统之存储管理

    以下是本人大学学计算机操作系统的笔记.有版权的,转载请注明出处. 存储管理:就是对内存的管理. 内存管理提高存储器的利用率以及从逻辑上扩充存储器. 存储管理功能: 内存的回收与分配,地址变换(程序中的 ...

最新文章

  1. 谷歌无人车十年记:理想背后的骨感现实 | 厚势汽车
  2. R语言入门第六集 实验五:综合应用
  3. Vue:利用Vue生成的网页,在浏览器中的标签页中的图标与标题怎么修改为自己的?
  4. c++ 一日一练:istream.rdbuf(ostringstream.rdbuf())无效!
  5. python的rsa公钥解密方法
  6. HTML在手机上实现直接拨打电话以及发送短信
  7. tb计算机存储单位_如何节省数TB的云存储
  8. 单线程智能聊天机器人
  9. 汉诺塔c 语言程序代码,汉诺塔c语言程序代码.doc
  10. genymotion-安卓模拟器-IMEI修改方法
  11. 圆锥曲线之用齐次法求解直线过定点问题
  12. 电子传真在金融业务的应用
  13. c语言实现http下载功能
  14. 厦大C语言上机 1360 算日期
  15. EasyBPM进销存之物料管理
  16. 2023届软件工程双非毕业生的秋招经历和经验分享【免费获取面经】
  17. Python爬虫核心知识-序章:课程前导-爬虫的相关法律法规
  18. 网盘可以良心到什么程度? 试试MEGA吧!
  19. 通达信,MACD底背离(买入信号之一)
  20. 多索引、多类型查询:

热门文章

  1. linux系统sql语句报错_如果数据库管理工具1045错误出现在Linux系统中怎么
  2. linux系统远程工具,分享|Remmina:一个 Linux 下功能丰富的远程桌面共享工具
  3. 在学习Python中,这个知识我们一定要看一遍,记不住没关系单一定要知道,字符串常用函数用法
  4. Python类的多态和多态性
  5. python中的及||
  6. Python教程:collections的deque()方法
  7. Python 全局变量和局部变量迷惑人的小示例
  8. C语言getenv()函数的用法?(获取系统某个环境变量字符串名的值)(windows VS上用_dupenv_s()函数)
  9. sigmoid函数(Logistic函数)
  10. python os.removedirs() 和shutil.rmtree()(os.removedirs用于删除非空文件夹和子文件夹、shutil.rmtree用于删除文件夹下所有文件夹和文件)