【操作系统习题】三个并发进程 R、M、P 共享一个可循环使用的缓冲区 B

2023-05-16

文章目录

  • 习题题目
    • 一、解题思路
    • 二、代码
  • 结语
  • 引用


习题题目

今有三个并发进程 R、M、P,它们共享了一个可循环使用的缓冲区 B,缓冲区 B 共有 N 个单元。进程 R 负责从输入设备读信息,每读一个字符后,把它存放在缓冲区 B 的一个单元中;进程 M 负责处理读入的字符,若发现读入的字符中有空格符,则把它改成“,”;进程 P 负责把处理后的字符取出并打印输出。当缓冲区单元中的字符被进程 P 取出后,则又可用来存放下一次读入的字符。请用 P、V 操作为同步机制写出它们能正确并发执行的程序。


一、解题思路

本题和一个经典进程同步问题—— “生产者——消费者” 问题相似,“生产者——消费者” 描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。以此基本问题为启发思路,对上面的并发进程 “R、M、P” 问题我想到了可以设置如下几个同步信号量。

  • 空缓冲区的数目,用 empty 表示,其初值为 N
  • 满缓冲单元的数目(即字符数目),用 full 表示,其初值为 0
  • 存在缓存区但未处理的字符数目,用 undeal 表示,其初值为 0(这里的 undeal 这个单词可能不符合英语语言,为了便于理解,用了这个单词,若有更好的意见,请在评论区回复)
  • 存在缓存区且已处理的字符数目,用 dealed 表示,其初值为 0

在本题目中,有三个进程 R、M、P 在执行时都要对有界缓冲区进行操作,也就是说它们需要共享有界缓冲区,因此对有界缓冲区的使用必须互斥,为此还需要设置一个互斥信号量 mutex,其初值为 1。

二、代码

该并发进程 “R、M、P” 问题的同步描述如下:

semaphore full=0;               /* 满缓冲单元的数目 */
semaphore empty=N;              /* 空缓冲单元的数目 */
semaphore undeal=0;             /* 未处理的字符数目 */
semaphore dealed=0;             /* 已处理的字符数目 */
semaphore mutex=1;              /* 对有界缓冲区进行操作的互斥信号量 */

main()
{
	cobegin
		R();
		M();
		P();
	coend
}
R()
{
	while (true)
	{
		读一个字符;
		P(empty);
		P(mutex);
		将一个字符送入缓冲区;
		V(mutex);
		V(undeal)
		V(full);
	}
}
M()
{
	while (true)
	{
		P(undeal);
		P(mutex);
		处理字符;
		V(mutex);
		V(dealed);
	}
}
P()
{
	while (true)
	{
		P(full)
		P(dealed);
		P(mutex);
		从缓冲区中取一个字符;
		V(mutex);
		V(empty);
		打印一个字符;
	}
}

结语

欢迎大家评论留言讨论,若有不当和错误的地方也欢迎大家指出,共同进步!

引用

  • [1] 郑鹏,曾平,金晶. 计算机操作系统(第二版)[M]. 武汉:武汉大学出版社,2014:56-58.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【操作系统习题】三个并发进程 R、M、P 共享一个可循环使用的缓冲区 B 的相关文章

随机推荐

  • FTPClient 中文目录、中文文件名乱码、上传文件失败 解决方法

    FTPClient上传中文目录 中文文件名乱码问题解决方法 本文使用的FTP工具包为 apache的 commons net 起因 xff1a 今天在做FTP上传时一直上传文件上传不了 xff0c xff08 代码是跑通了 xff0c 但是
  • maven idea设置查找依赖优先从本地仓库获取

    第一步 xff1a 在这个settings里面 xff0c 设置默认的 第二步设置参数 DarchetypeCatalog 61 internal
  • Android集成OpenCV(NDK)

    1 下载OpenCv的动态库 so OpenCv官网 这边下载的是4 6 0 2 解压opencv 4 6 0 android sdk zip 复制目录opencv 4 6 0 android sdk OpenCV android sdk
  • Win10 重装系统备忘

    文章目录 一 美化工具1 Dism 43 43 很方便的简化 34 资源管理器 34 xff0c 比网上的教程方便很多 还有右键菜单等等 2 StartIsBack 可以吧 34 Win10菜单栏 34 xff08 屏幕下面那一横排 xff
  • ubuntu无法打开terminal

    我是在将系统显示设置为中文显示后 xff0c 重启无法打开终端的 xff0c 可以按照下面的链接进行修改 http blog csdn net u010395144 article details 52794947
  • MariaDB用法——增删改查

    数据库四大护法 增insert 删delete 改update 查select 设置禁用mysql删除语句 xff0c 防止操作者误删数据 mysql secure installation mysql基础安全设置 xff0c 设置密码 c
  • 女生学Java好不好就业?看看学完Java的你就业道路有多广?

    技能总在将学未学时最为美好 xff0c 高薪可期 Java xff0c 这门于 1995 年正式发布的老牌编程语言 xff0c 在每年 Github 的开发者报告统计出来之时 xff0c 总居前三高位不下 xff0c 成为使用人数最多的编程
  • Spring MVC 执行流程详解

    一 Spring MVC 执行流程 客户端的所有请求都会交给前端控制器DispatcherServlet来处理 xff0c DispatcherServlet会负责调用系统的其他模块来完成用户请求的处理 xff1b 即用户发送的请求会先从D
  • 程序员5大热门发展行业,就业迷茫的同学注意啦!

    信息化时代 xff0c 程序员成为各行业中的香饽饽岗位 xff0c 发展空间大 xff0c 薪资福利高 xff0c 因此最近几年转向程序员岗位的小伙伴越来越多 xff0c 不过因为这种 青睐 xff0c 使得程序员岗的竞争也越发大了 xff
  • 非常易懂且全面的计算机科学概论知识总结

    计算机科学概论 xff08 美 xff09 布鲁克希尔 这本书非常推荐大家去读一下 xff0c 作者用非常浅显易懂的语言让你能够对计算机领域有一个全面的认识和了解 xff0c 我在研一时候读的 xff0c 这本书让我受益匪浅 xff0c 对
  • Java 进口管制限制解除

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 由于国外的进出口限制 xff0c 对Java密码算法体系进行了一些限制 xff0c 为了解除限制 x
  • java中的String可以有多长?

    参考链接 xff1a https www cnblogs com ibelieve618 p 6380328 html https www cnblogs com htyj p 8337209 html https blog csdn ne
  • 实训第一周周志

    通过这一周的学习 xff0c 我学会了以下几点 xff1a 1 学会了如何规范自己的目录 xff0c 建立自己的工作区 像老师一样建立 WuCS 01tech 02proj day01 txt day02 txt 01tech day01
  • 实训第二周周志

    通过这一周的学习 xff0c 我学会了以下几点 xff1a 1 我学会了 git 代码的提交 首先创建仓库与仓库初始化 xff0c 然后建立分支 xff0c 提交代码到分支 1 1 创建工作目录 1 2 初始化仓库git init 1 3
  • 实训第三周周志

    通过这一周的学习 xff0c 我学会了以下几点 xff1a 1 了解了项目的安排 1 1 第一阶段 xff1a 01 项目GUI 43 AI 基础技术 xff08 数据集处理 43 机器学习 特征的分类 43 深度学习 特征的学习 xff0
  • 实训第四周周志

    通过这一周的学习 xff0c 我学会了以下几点 xff1a 1 了解了一下神经网络模型 01 卷积神经网络 xff1a 手写数字识别 02 Lenet 5 03 AlexNet 04 ResNet 05 GoogLeNet 06 Effic
  • 实训第五周周志

    最后一周的学习主要是对自己项目的优化和改进 xff0c 以及结项 我们项目的结构图和类图如下所示 xff1a 结构图 xff1a 类图 xff1a 框架图说明 1 本次项目工程分为人脸识别和车牌识别 xff0c ui设计共有两个页面 xff
  • 【Python】Python 编程基本规范

    文章目录 前言一 编码二 代码格式1 缩进2 行宽3 引号4 空行5 import语句6 空格7 换行8 docstring 结语引用 前言 在初步学习 Python 之后 xff0c 我们需要了解 Python 代码的规范 本文章将简单介
  • MongoDB基础指令

    MongoDB基础指令 1 创建数据库2 删除数据库3 创建集合4 删除集合5 插入文档 数据 6 更新数据7 删除文档8 查询文档9 条件操作符10 Type操作符 1 创建数据库 use 数据库名字 use TestData use 语
  • 【操作系统习题】三个并发进程 R、M、P 共享一个可循环使用的缓冲区 B

    文章目录 习题题目一 解题思路二 代码 结语引用 习题题目 今有三个并发进程 R M P xff0c 它们共享了一个可循环使用的缓冲区 B xff0c 缓冲区 B 共有 N 个单元 进程 R 负责从输入设备读信息 xff0c 每读一个字符后