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


习题题目

今有三个并发进程 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.
  • 21
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuasyYi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值