操作系统期末复习大题---经典进程的同步问题

目录

一、经典进程的同步问题

1. 利用记录型信号量解决生产者—消费者问题

执行流程:

”生产者-消费者”问题模型代码框架如下: 

 注意:

小结:

复习典型例题:

解答:

2. 利用AND信号量解决生产者——消费者问题

代码框架:

生产者消费者模型举例

例一、

例二、 

例3:父亲-母亲-儿子-女儿两个苹果或桔子

例4

练一练(2009年考研真题)

题目:

分析:考虑题目中的互斥和同步问题

答案:

 例题:

分析:

解答

练一练(2014年真题)

2.5.2哲学家进餐问题

 学以致用(2019真题)

2.5.3  读者-写者问题

 补充:吸烟者问题


一、经典进程的同步问题

重点内容:

•掌握“生产者-消费者”问题模型
•掌握“哲学家进餐”问题模型
•掌握“读者-写者”问题模型

1. 利用记录型信号量解决生产者消费者问题

执行流程:

”生产者-消费者”问题模型代码框架如下: 
semaphone mutex=1,empty=n,full=0;
item buffer[n];
int in=0, out = 0;
main(){cobegin{ producer{  produce an item nextp;wait(empty);wait(mutex);buffer(in)=nextp;in=(in+1) % n;signal(mutex);   //释放使用权signal(full);    //唤醒消费者}consumer{wait(full);wait(mutex);nextc=buffer(out);out= (out+1) % n;signal(mutex);    //释放使用权signal(empty);    //唤醒生产者consume the item in nextc;}}coend
}
 注意:

在有多个信号量同时存在的情况下,WAIT操作往往是不能颠倒顺序的,必须先对资源信号量进行WAIT操作,再对互斥信号量进行WAIT操作,这样可以在占用共享资源的访问权时保证有资源可用,不然会导致产生占用使用权而无资源可用的“死等”现象。

小结:

复习典型例题:

解答:

2. 利用AND信号量解决生产者——消费者问题

代码框架:
semaphone mutex=1,empty=n,full=0;
item buffer[n];
int in=0, out = 0;
main(){cobegin{ producer{  produce an item nextp;wait(empty,mutex);buffer(in)=nextp;in=(in+1) % n;signal(mutex,full);}consumer{wait(full,mutex);nextc=buffer(out);out= (out+1) % n;signal(mutex,empty); consume the item in nextc;}}coend
}

问题推广:

                  一组生产者,一组消费者,公用 n个环形缓冲区

思考:如何高效的存取,生产者之间公用一个in指针,消费者之间公用一个out指针,如何设置信号量?

empty:表示缓冲区是否为空,初值为n;      full:表示缓冲区是否为满,初值为0

mutex1:生产者之间的互斥信号量,初值为1;mutex2:消费者之间的互斥信号量,初值为1

设缓冲区的编号为1n-1,定义两个指针inout,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

第三种情况,可以理解成有多间牛奶生产厂家,如蒙牛,达能,光明等,消费者也不只小明一人,有许许多多消费者。不同的牛奶生产厂家生产的商品可以放在不同的零售分店中销售,而不同的消费者可以去不同的分店中购买。当某一分店已放满某个厂家的商品时,下一个厂家只能把商品放在下一间分店。所以在这种情况中,生产者与消费者存在同步关系,而且各个生产者之间、各个消费者之间存在互斥关系,他们必须互斥地访问缓冲区。


生产者消费者模型举例

例一、

分析:爸爸和儿子两个进程相互制约,爸爸进程执行完即往盘中放入苹果后,儿子进程才能执行即吃苹果。因此该问题为进程间的同步问题。 

 


例二、 

2. 桌上有一空盘,允许存放一只水果,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用。

   请用Wait/Signal原语实现爸爸、儿子、女儿三个并发进程的同步。

设置三个信号量:

Semaphore S=1;   //S 表示盘子是否为空;
Semaphore S1=0; //S1表示盘中是否有苹果;
Semaphore S2=0; //S2表示盘中是否有桔子;

此问题还可继续推广:父亲-母亲-儿子-女儿一个苹果或桔子 问题;父亲-母亲-儿子-女儿两个苹果或桔子 问题;

3:父亲-母亲-儿子-女儿两个苹果或桔子

分析:盘子为互斥资源,因可以放2个水果,empty初值为2 且需设置互斥信号量mutex=1

还可进一步推广:两个儿子,两个女儿的情况!

semaphores=2(可用位置);  s1=0(苹果数);  s2=0(桔子数);mutex=1;

爸爸:wait(s); wait(mutex);放苹果; signal(mutex); signal(s1);

妈妈:wait(s); wait(mutex); 放桔子; signal(mutex); signal(s2);

儿子:wait(s2); wait(mutex); 取桔子; signal(mutex); signal(s);

女儿:wait(s1); wait(mutex); 取苹果; signal(mutex); signal(s);

4

4某幼儿园举行趣味活动,每两个小朋友一组。重复做如下活动:一个小朋友负责用一个小桶在A沙堆取沙子,然后倒入一大盆中,另一小朋友负责用一个小桶从大盆中取沙子倒入B沙堆。大盆最多能装10桶沙子,且在大盆中取沙子和倒沙子不能同时进行。试用信号量操作描述这两个小朋友的同步过程。

empty:表示大盆是否为空,初值为10

full    :表示大盆是否为满,初值为0

mutex表示可否对大盆进行操作,初值为1.

解答:

练一练(2009年考研真题)

题目:

        三个进程P1P2P3互斥使用一个包含N个单元的缓冲区。P1每次用produe()产生一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步和互斥活动,并说明所定义信号量的含义(要求用伪代码描述)。

分析:考虑题目中的互斥和同步问题
互斥问题:缓冲区只能互斥,设置互斥信号量 mutex ;
同步问题 :  P1 P2 因为奇数的放置和取用同步,设置信号量 odd P1 P3 因为偶数的放置与取用取得同步,设置同步信号量 even P1 P2 P3 因为共享缓冲区,设置同步信号量 empty.

信号量定义:

semaphore mutex=1;//缓冲区操作互斥信号量
semaphore odd=0,even=0;//奇数偶数同步信号量
semaphore empty=N;//空缓冲区个数

答案:


 例题:

某寺庙有小和尚、老和尚若干。

有一个水缸,由小和尚打水入缸供老和尚饮用。 水缸可容纳 10 桶水
水取自同一井中。 每次只能容纳一个桶取水 水桶总数为 3 。每次入、取水仅为一桶, 且不可同时进行
给出有关取水、入水的算法描述。

分析:

semaphore empty=10;// 表示缸中目前还能装多少桶水,初始时能装10桶水

semaphore full=0;// 表示缸中有多少桶水,初始时缸中没有水

semaphore buckets=3;// 表示有多少只空桶可用, 初值为3

semaphore mutex_well=1;// 用于实现对井的互斥操作

semaphore mutex_bigjar=1; // 用于实现对缸的互斥操作

解答


练一练(2014年真题)

系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量PVwait,singnal)操作实现进程间的互斥和同步,要求写出完整的过程,并说明所用信号量的含义和初值。

分析:

semaphore empty=1000;//空缓冲区的个数
semaphore full=0;//缓冲区的产品数
semaphore mutex1=1;//控制消费者进程一个周期内互斥访问
semaphore muter2=1;//进程单次互斥访问临界区

解答:


2.5.2哲学家进餐问题

前面描述了多个进程竞争一个临界资源的情况及通用模板,那么,对于多个进程竞争多个临界资源的情况,又该如何描述呢?哲学家就餐问题就是对这类问题的一个抽象!

思考:如果同时拿起左筷子?

死锁解决方法:

 解决方法1:

 

解决方法2:

解决方法3:

 学以致用(2019真题)

nn>=3)位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在圆桌中心有mm>=1)个碗,每两位哲学家之间有1根筷子。每位哲学家必须取到一个碗和两侧的筷子之后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的PV操作(wait()signal()操作)描述上述过程中的互斥与同步,并说明所用信号量及初值的含义

   信号量bowl用于协调哲学家对碗的使用, bowl<n,确保不死锁,

即至少保证有一个人拿不到碗,那么就能保证至少有一个人能拿到左右的筷子。

     semaphone bowl=min(n-1,m);

  信号量chopsticks用于协调哲学家对筷子的使用,两个哲学家之间的筷子数量为1

    semaphone chopsticks[n]={1,1,...,1};


2.5.3  读者-写者问题

对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个。

  • “读-写”互斥,
  • “写-写”互斥,
  • "读-读"允许


 补充:吸烟者问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python入门第09篇(conda虚拟环境)

前言 一开始默认安装了最新的Python3.12&#xff0c;搞的倒也顺手&#xff0c;看别人会有不兼容的问题&#xff0c;在我这开始没出现。不过坑总会踩到的&#xff0c;这不就出问题了。pip install一个包一直不行&#xff0c;问了下度娘&#xff0c;说由于这个包使用了一些新技术…

复试 || 就业day04(2024.01.05)项目一

文章目录 前言线性回归房价预测加载数据数据查看数据拆分数据建模模型的验证、应用模型的评估 总结 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容来自某机构网课&#xff0c;是我为复试准备的第一个项目 &#…

Linux驱动学习—ioctl接口

1、unlock_ioctl和ioctl有什么区别&#xff1f; kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针&#xff0c;取而代之的是unlocked_ioctl 。ioctl是老的内核版本中的驱动API&#xff0c;unlock_ioctl是当下常用的驱动API。unlocked_ioctl 实际上取…

【排序算法总结】

目录 1. 稳点与非稳定排序2. 冒泡排序3. 简单选择排序4. 直接插入排序5. 快排6. 堆排7. 归并 1. 稳点与非稳定排序 不稳定的&#xff1a;快排、堆排、选择原地排序&#xff1a;快排也是非原地排序&#xff1a;归并 和三个线性时间排序&#xff1a;桶排序 &#xff0c;计数&…

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于萤火虫算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于萤火虫优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

安科瑞新能源汽车车充电桩有序充电——安科瑞 顾烊宇

要&#xff1a;随着当前经济的不断发展&#xff0c;国家的科技也有了飞速的进步&#xff0c;传统的燃油汽车已经不能适应当前社会的发展&#xff0c;不仅对能源造成巨大的消耗&#xff0c;还对环境造成了污染&#xff0c;当前一种新型的交通运输工具正在占领汽车市场。新能源汽…

物理与网络安全

物流环境安全 场地选择考虑抗震、承重、防火、防水、供电、空气调节、电磁防护、雷击及静电 场地因素&#xff1a; 自然灾害&#xff0c;社会因素&#xff08;加油站、化工厂&#xff09;&#xff0c;配套条件&#xff08;消防&#xff0c;交通&#xff0c;电力&#xff0c;…

爬虫实战3-js逆向入门:以黑猫投诉平台为例

目录 引言 逆向过程 步骤一&#xff1a;找到参数对应js代码位置 步骤二&#xff1a;分析参数值的生成逻辑 步骤三&#xff1a;确定函数u的具体内容 步骤四&#xff1a;使用python实现请求参数的生成 投诉信息爬取 引言 下面是一张主流网页加密方法的思维导图&#xff0c…

算法每日一题:统计重复个数 | 字符串

大家好&#xff0c;我是星恒 感觉好难呀呀呀&#xff01;今天是一道困难题目&#xff0c;思路挺简单&#xff0c;但是有些细节点不是很容易想通&#xff0c;建议大家多画图试一试&#xff0c;这样就会好理解许多 题目&#xff1a;leetcode 466定义 str [s, n] 表示 str 由 n 个…

OpenHarmony之消息机制实现

OpenHarmony之消息机制实现 背景 在之前的介绍&#xff08;OpenHarmony之HDF驱动框架&#xff09;中&#xff0c;了解到OpenHarmony的消息机制主要有以下两种&#xff1a; 用户态应用发送消息到驱动。用户态应用接收驱动主动上报事件。 下面我们分别来看看两种机制用户态的…

23 导航栏

效果演示 实现了一个响应式的导航栏&#xff0c;当鼠标悬停在导航栏上的某个选项上时&#xff0c;对应的横条会从左到右地移动&#xff0c;从而实现了导航栏的动态效果。 Code <div class"flex"><ul><li>1</li><li>2</li><l…

第三部分使用脚手架:vue学习(61-65)

文章目录 61 创建vue脚手架![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f71d4324be0542209e690ab9e886d199.png)62 分析脚手架结构63 render函数64 修改默认配置65 ref 属性 61 创建vue脚手架 写完vue文件&#xff0c;没有脚手架做翻译&#xff0c;浏览器不认识…

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于引力搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于引力搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

计算机网络学习笔记(一)

文章目录 1.1 请介绍七层网络体系结构。2 .请介绍五层网络体系结构。3 .了解网络编程协议吗&#xff1f;客户端发送给服务器的请求&#xff0c;怎么确定具体的协议&#xff1f;4. TCP、HTTP、FTP分别属于哪一层&#xff1f;5. 讲一下TCP/IP协议。6 .说一说你对ARP协议的理解。7…

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于闪电搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

机器学习实践

1.波士顿房价预测 波士顿房屋的数据于1978年开始统计&#xff0c;共506个数据点&#xff0c;涵盖了波士顿不同郊区房屋的14种特征信息。 在这里&#xff0c;选取房屋价格&#xff08;MEDV&#xff09;、每个房屋的房间数量&#xff08;RM&#xff09;两个变量进行回归&#xff…

解决报错Exception encountered during context initialization

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读报错解决 报错 今天在测试一个类时&#xff0c;突然间报了以下错误。 juni…

vmware安装centos 7.6 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.6 操作系统镜像文件2、安装centos 7.6操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.6 操作系统镜像文件 这里选择 2018年10月发布的 7.6 版本 官方下载链…

vscode安装Prettier插件,对vue3项目进行格式化

之前vscode因为安装了Vue Language Features (Volar)插件&#xff0c;导致Prettier格式化失效&#xff0c;今天有空&#xff0c;又重新设置了一下 1. 插件要先安装上 2. 打开settings.json {"editor.defaultFormatter": "esbenp.prettier-vscode","…