同步互斥相关习题2 8道 含详解

14

一组进程的执行顺序如下图所示,圆圈P1,P2,P3,P4,P5,P6表示进程,弧上的字母a,b,c, d,e,f,g,h表示同步信号量,请用P,V操作实现进程的同步。
![[Pasted image 20241119183422.png]]


semaphore a = b = c = d = e = f = g = h = 0;
CoBegin
process P1()
{执行P1;V(a);V(b);
}
process P2()
{P(a);执行P2;V(c);V(d);
}
process P3()
{P(b);执行P3;V(e);V(f);
}
process P4()
{P(c);P(e);执行P4;V(g);
}
process P5()
{P(d);P(f);执行P5;V(h);
}
process P6()
{P(g);P(h);执行P6;
}
CoEnd
15

有3个进程P、P1、P2合作处理数据,P从输入设备读数据到缓冲区,缓冲区可存1000个字。
P1和P2的功能一样,都是从缓冲区取出数据并计算,再打印结果。请用信号量的P,V操作实现。
其中,语句
read()从输入设备读入20个字到缓冲区;
get()从缓冲区取出 20个字;
comp()计算40个字输出并得到结果的1个字;
print()打印结果的2个字。


生产者消费者问题,把缓冲区的每20个字视为一个基本单位,因此缓冲区共有1000/20=50个空位。设置互斥信号量mutex,用于对缓冲区的访问;还需要设置两个同步信号量,full表示缓冲区已有多少数据,empty表示缓冲区还有多少空位置

semaphore mutex = 1;      // 互斥使用缓冲区
semaphore full = 0;       // 表示缓冲区中已有多少个20字数据
semaphore empty = 50;     // 表示缓冲区中还有多少个20字空位process P()
{P(empty);P(mutex);read();V(mutex);V(full);
}
process P1/P2()
{P(full);get();P(full);get();comp();V(empty);print();V(empty);print();
}
16

假设有3个抽烟者和1个供应者。每个抽烟者不停地卷烟并抽掉它,但要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。
三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三个拥有胶水。
供应者无限提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉已完成,此时供应者就将另外两种材料放到桌上,如此重复,让3个抽烟者轮流抽烟。


供应者与3个抽烟者分别是同步关系,三个抽烟者对抽烟这个动作互斥
设置信号量offer1,offer2,offer3分别表示烟草和纸,烟草和胶水,纸和胶水
信号量finish用于互斥进程抽烟动作

int num = 0;     // 存储随机数
semaphore offer1 = offer2 = offer3 = finish = 0;
// finish表示抽烟是否完成
process P1()
{while (1){num++;num = nun % 3;if (num == 0)V(offer1);else if (num == 1)V(offer2);elseV(offer3);任意两种材料放在桌子上P(finish);}
}
process P2()
{while (1){P(offer3);抽烟;V(finish);}
}
process P3()
{while (1){P(offer2);抽烟;V(finish);}
}
process P4()
{while (1){P(offer1);抽烟;V(finish);}
}
18

某银行提供1个服务窗口和10个供顾客等待的座位。
顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。
取号机每次仅允许一位顾客使用。
当营业员空闲时,通过叫号选取一位顾客,并为其服务。
顾客和营业员的活动过程描述如下:

cobegin
{process 顾客i{从取号机获取一个号码;等待叫号;获取服务;}process 营业员{while(TRUE){叫号;为客户服务;}}
}
coend

请添加必要的信号量和P,V操作,实现上述过程中的互斥与同步。
要求写出完整的过程,说明信号量的含义并赋初值。


互斥资源:取号机,设置互斥信号量mutex
同步问题:空座位的有无影响等待顾客的数量,顾客的有无决定了营业员是否能开始服务,因此分别设置信号量empty和full来实现这一同步关系
顾客获得空座位后,需要等待叫号和被服务,又是一个同步关系,定义信号量service

semaphore empty = 10;   // 空座位的数量
semaphore mutex = 1;    // 互斥使用取号机
semaphore full = 0;     // 已占座位的数量
semaphore service = 0;  // 等待叫号
cobegin
{process 顾客i{P(empty);       // 申请空座位-1P(mutex);       // 申请取号机-1从取号机获取一个号码;V(mutex);       // 释放取号机+1V(full);        // 释放一个已占座位,数量+1P(service);     // 消耗一个叫号,-1获取服务;}process 营业员{while(TRUE){P(full);    // 申请一个已占座位,数量-1V(empty);   // 释放一个空座位,数量+1V(service); // 释放一个叫号,+1为客户服务;}}
}
coend
20

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


生产者和消费者问题
设置4个信号量mutex1,mutex2,empty和full,
mutex1用于控制一个消费者进程在一个周期内对缓冲区访问,初值为1
mutex2用于控制进程在单次互斥地访问缓冲区,初值为1
empty代表缓冲区的空位数,初值为1000
full代表缓冲区的产品数,初值为0

semaphore mutex1 = 1;     // 用于实现消费者周期内的互斥
semaphore mutex2 = 1;     // 用于实现访问缓冲区的互斥
semaphore empty = 1000;   // 空缓冲区数
semaphore full = 0;       // 非空缓冲区数producer()
{while (1){生产一个产品;P(empty);        // 申请一个空位P(mutex2);       // 互斥使用缓冲区把产品放入缓冲区;V(mutex2);       // 释放缓冲区V(full);         // 释放一个产品}
}consumer()
{while (1){P(mutex1);       // 消费者使用缓冲区for (int i = 0; i < 10; ++i){P(full);             // 消耗一个产品P(mutex2);           // 互斥使用缓冲区从缓冲区取出一件产品;V(mutex2);           // 释放缓冲区V(empty);            // 释放一个空位消费这件产品;}V(mutex1);      // 消费者释放缓冲区}
}
21

有A,B两人通过信箱进行辩论,每个人都从自己的信箱中取得对方的问题。
将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中。
假设A的信箱最多放M个邮件,B的信箱最多放N个邮件。
初始时A的信箱中有x个邮件(0<x<M), B的信箱中有y个邮件(0<y<N)。
辩论者每取出一个邮件,邮件数减1。
A和B两人的操作过程描述如下:

CoBegin
A{while(TRUE){从A的信箱中取出一个邮件;回答问题并提出一个新问题;将新邮件放入B的信箱; }
}
B
{while(TRUE){从B的信箱中取出一个邮件;回答问题并提出一个新问题;将新邮件放入A的信箱;}
}
Coend

当信箱不为空时,辩论者才能从信箱中取邮件,否则等待。
当信箱不满时,辩论者才能将新邮件放入信箱,否则等待。
请添加必要的信号量和PV操作,以实现上述过程的同步。要求写出完整的过程,并说明信号量的含义和初值。


生产者消费者问题
A和B既是生产者也是消费者,信箱A和B是缓冲区,需要互斥访问
设置fullA = x,emptyA = m-x,fullB = y,emptyB = N-y,mutexA = 1,和mutexB = 1
互斥信号量的PV操作直接夹住对信息的操作
对信箱A操作之前,检查fullA是否有邮件可取,放入B时检查emptyB是否有空余空间可以放,放完后执行V(fullB),表示B中增加了一个邮件

CoBegin
A{while(TRUE){P(fullA);P(mutexA);从A的信箱中取出一个邮件;V(mutexA);V(emptyA);回答问题并提出一个新问题;P(emptyB);P(mutexB);将新邮件放入B的信箱;V(mutexB);V(fullB); }
}
B
{while(TRUE){P(fullB);P(mutexB);从B的信箱中取出一个邮件;V(mutexB);V(emptyB);回答问题并提出一个新问题;P(emptyA);P(mutexA);将新邮件放入A的信箱;V(mutexA);V(fullA);}
}
Coend
23

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


当碗的数量m小于哲学家数量n时,直接让碗的资源量等于m,避免死锁
当m大于n时,让碗的资源量=n-1,避免死锁
在PV操作时,要先P碗

semaphore bowl;
semaphore chopsticks[n];
for (int i = 0; i < n; i++)
{chopsticks[i] = 1;
}
bowl = min(n-1, m);CoBegin
while (TRUE)
{思考;P(bowl);P(chopsticks[i]);P(chopsticks[(i+1) % n]);就餐;V(chopsticks[i]);V(chopsticks[(i+1) % n);V(bowl);
}
CoEnd
25

下表给出了整型信号量S的wait(和signalO操作的功能描述,以及采用开/关中断指令实现信号量操作互斥的两种方法。
功能描述

Semaphore S;
wait(S)
{while(S<=0);S = S-1;
}signal(S)
{S = S + 1;
}

方法1

Semaphore S;
wait(S)
{关中断;while (S <= 0); S = S-1;开中断;
}signal(S)
{ 关中断;S = S + 1; 开中断;
}

方法2

Semaphore S;
wait(S)
{关中断;while(S <= 0){开中断;关中断;}S = S-1; 开中断;
}signal(S)
{ 关中断; S = S + 1; 开中断;
}

请回答下列问题。

  1. 为什么在wait()和signal()操作中对信号量S的访问必须互斥执行?
  2. 分别说明方法1和方法2是否正确。若不正确,请说明理由。
  3. 用户程序能否使用开/关中断指令实现临界区互斥?为什么?

  1. 信号量S是能被多个进程共享的变量,多个进程都可通过wait和signal对S进行读、写操作。所以,wait和signal操作中对S的访问必须是互斥的。
  2. 方法1错误。在wait中,当S<=0时,关中断后,其他进程无法修改S的值,while语句陷入死循环。方法2正确。方法2在循环体中有一个开中断操作,这样就可以使其他进程修改S的值,从而避免while语句陷入死循环。
  3. 用户程序不能使用开/关中断指令实现临界区互厅。因为开中断和关中断指令都是特权指令,不能在用户态下执行,只能在内核态下执行。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CDH大数据平台搭建

各大开源以及商用厂商的大数据产品汇总&#xff1a; https://zhuanlan.zhihu.com/p/675011462 Ambari 界面&#xff1a; 一、安装一个新的虚拟机 配置要求&#xff1a;8核&#xff0c;10G内存&#xff0c;最好是200G 修改yum源&#xff1a; 修改阿里云的镜像文件&#xff1…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者&#xff0c;我主要想告诉大家一些关于骨传导耳机的知识。其中&#xff0c;要远离所谓的不专业产品&#xff0c;它们的佩戴不适和音质不佳问题高得吓人&#xff0c;尤其是很多宣称能提供舒适佩戴和高音质的产品&#xff0c;超过九成的用…

【YOLOv11改进[注意力]】引入DA、FCA、SA、SC、SE + 含全部代码和详细修改方式

本文将进行在YOLOv11中引入DA、FCA、SA、SC、SE魔改v11,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 一 DA、FCA、SA、SC、SE ① DA 论文:Dual Attention Network for Scene Segm

捉虫笔记(六)-谁把系统卡住了?

06-谁把系统卡住了&#xff1f; 1、现象 QA反馈&#xff0c;在软件退出的时候&#xff0c;会把整个系统卡住&#xff0c;将近40s。我第一反应这么离谱&#xff0c;我们的软件有这么大的“魅力”&#xff0c;将老大哥抖三抖。 我立马重现现场&#xff0c;果然如此。虽然没有Q…

网络安全之信息收集-实战-2

请注意&#xff0c;本文仅供合法和授权的渗透测试使用&#xff0c;任何未经授权的活动都是违法的。 目录 7、网络空间引擎搜索 8、github源码泄露 9、端口信息 10、框架指纹识别 11、WAF识别 12、后台查找 7、网络空间引擎搜索 FOFA&#xff1a;https://fofa.info/ 360 …

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱&#xff0c;行动更加稳健 目前四足机器人的全球市场上&#xff0c;市场份额最大的是哪个国家的企业&#xff1f;A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一&#xff0c;数组翻转 1.概述:数组对称索引位置上的元素互换&#xff0c;最大值数组序号是数组长度减一 创建跳板temp&#xff0c;进行min和max的互换&#xff0c;然后min自增&#xff0c;max自减&#xff0c;当min>max的时候停止互换&#xff0c;代表到中间值 用代码实…

jquery 链模式调用简易实现

<script>// 定义一个名为A的构造函数&#xff0c;接受selector和context参数var A function (selector, context) {// 返回一个新的A.fn.init实例return new A.fn.init(selector, context);}// 设置A的原型和fn属性A.fn A.prototype { // 强化构造器:// 当显式地重写 …

无人机侦察打击方案(1)

​​​​​ 概述 任务来源于无人机侦察研制任务&#xff0c;涵盖无人机目标昼夜识别与跟踪、目标定位等功能任务。 组成及功能 无人机侦察系统设备构成如下图所示&#xff0c;分为光电云台、激光打击设备与操控端构成。 图 1 设备组成与链路 光电云台完成无人机目标自主识别…

Windows 系统通过 MSTSC 上传文件到 Windows 云服务器

操作场景 文件上传 Windows 云服务器的常用方法是使用 MSTSC 远程桌面连接&#xff08;Microsoft Terminal Services Client&#xff09;。本文档指导您使用本地 Windows 计算机通过远程桌面连接&#xff0c;将文件上传至 Windows 云服务器。 前提条件 请确保 Windows 云服务…

激光雷达定位初始化的另外一个方案 通过键盘按键移动当前位姿 (附python代码)

通常使用的是通过在 rviz 中点选指定初始化位置和方向来完成点云的初始化匹配。 但是这种粗略的初始化方法有时候可能不成功,因此需要使用准确的初始化方法,以更好的初始值进行无损检测配准。 为了提供更好的匹配初始值,我使用 Python 脚本获取键盘输入,并不断调整这个匹配…

枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~

目录 认识枚举 全文重点&#xff1a;枚举在单例模式中为什么是安全的&#xff1f; Lambda 表达式 概念&#xff1a; 函数式接口 lambda表达式的基本使用&#xff1a; lambda表达式的语法精简&#xff1a; lambda表达式的变量捕获 Lambda在集合当中的使用 在 Collecti…

【JAVA】一次操蛋的nginx镜像之旅

一、前言 由于我们的项目中使用到了nginx&#xff0c;同时我们的nginx是通过docker镜像进行安装的&#xff0c;由于nginx出现了问题&#xff0c;需要重新安装。于是。。。 二、通过docker进行安装 docker pull nginx:latest 1.5.2 脚本文件 在/home/docker/script路径下创…

高并发场景下的热点key问题探析与应对策略

目录 一、问题描述 二、发现机制 三、解决策略分析 &#xff08;一&#xff09;解决策略一&#xff1a;多级缓存策略 客户端本地缓存 代理节点本地缓存 &#xff08;二&#xff09;解决策略二&#xff1a;多副本策略 &#xff08;三&#xff09;解决策略三&#xff1a;热点…

.NET 9 的新增功能

文章目录 前言一、.NET 运行时二、序列化三、缩进选项四、默认 Web 选项五、LINQ六、集合七、PriorityQueue.Remove() 方法八、密码九、CryptographicOperations.HashData() 方法十、KMAC 算法十一、反射十二、性能十三、循环优化十四、本机 AOT 的内联改进十五、PGO 改进&…

11.19.2024刷华为OD

文章目录 HJ51HJ53 杨辉三角HJ56HJ57 高精度整数加法HJ58HJ60 简单题HJ63 DNA序列&#xff08;简单题&#xff09;语法知识记录 HJ51 https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d?tpId37&tags&title&difficulty0&judgeStatus0&…

小米表盘自定义工具支持最新小米9pro

app下载(v5.2.28) 点击下载 介绍 米坛小米表盘自定义工具是专为小米手环用户设计的软件&#xff0c;它具备以下特点和功能&#xff1a; 兼容性广泛&#xff1a;支持包括小米手环7、7Pro、8、8Pro、9、9Pro以及小米手表S3、S4在内的多款设备。 持续更新&#xff1a;软件不断…

算法-二叉树(从理论知识到力扣题,递归、迭代。)

二叉树 一、二叉树理论知识1、种类a.满二叉树b.完全二叉树c.二叉搜索树d.平衡二叉搜索树 2、java对于树的理解3、存储a.链式存储&#xff08;常用&#xff09;b.数组存储 4、遍历方式a.深度优先搜索b.广度优先搜索 5、树的定义&#xff08;链式&#xff09; 二、力扣题解写题思…

青训营刷题笔记10

问题描述 小C拿到了一个排列&#xff0c;她想知道在这个排列中&#xff0c;元素 xx 和 yy 是否是相邻的。排列是一个长度为 nn 的数组&#xff0c;其中每个数字从 11 到 nn 恰好出现一次。 你的任务是判断在给定的排列中&#xff0c;xx 和 yy 是否是相邻的。 测试样例 样例1…

时间类的实现

在现实生活中&#xff0c;我们常常需要计算某一天的前/后xx天是哪一天&#xff0c;算起来十分麻烦&#xff0c;为此我们不妨写一个程序&#xff0c;来减少我们的思考时间。 1.基本实现过程 为了实现时间类&#xff0c;我们需要将代码写在3个文件中&#xff0c;以增强可读性&a…