复杂的消息缓冲问题PV
来源:互联网 发布:短发发型设计软件 编辑:程序博客网 时间:2024/05/21 03:45
进程A1、A2...An1通过m个缓冲区向进程B1、B2......Bn2不断发送消息。发送和接收工作遵循下列规则:
(1) 每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于消息长度
(2) 对每个消息,B1,B2,Bn2都须各接收一次,读入各自的数据区内
(3) m个缓冲区都满时,发送进程等待,没有可读消息时,接收进程等待。
试用P、V操作组织正确的发送和接收工作。
提示:每个缓冲区只要写一次但要读n2次,因此,可以看成n2组缓冲区,每个发送者要同时写n2个缓冲区,而每个接收者只要读它自己的缓冲区。
Sin[n2]=m
Sout[n2]=0;
先将问题简化:设缓冲区的大小为1 有一个发送进程A1 有二个接收进程B1、B2
设有信号量Sin[1] 、Sin[2] 初值为1
设有信号量Sout[1] 、Sout[2] 初值为0
A1:
while (1)
{
P(Sin[1]);
P(Sin[2]);
将数据放入缓冲区
V(Sout[1]);
V(Sout[2]);
}
Bi:
while (1)
{
P(Sout[i]);
从缓冲区取数
V(Sin[i]);
}
设缓冲区的大小为m, 有一个发送进程A1 有二个接收进程B1、B2
设有信号量Sin[1] 、Sin[2] 初值为m
设有信号量Sout[1] 、Sout[2] 初值为0
A1:
while (1)
{
P(Sin[1]);
P(Sin[2]);
P(mutex);
将数据放入缓冲区
V(mutex);
V(Sout[1]);
V(Sout[2]);
}
Bi:
while (1)
{
P(Sout[i]);
P(mutex);
从缓冲区取数
V(mutex);
V(Sin[i]);
};
设缓冲区的大小为m 有n1个发送进程A1….An1有n2个接收进程B1…Bn2
设有n2个信号量Sin[n2] 初值均为m
设有n2个信号量Sout[n2] 初值均为0
设当前要写入的缓冲区为writenum = 0;
设n2个接受进程分别要读入的缓冲区为readnum[n2]={0,0...,0}
Aj:
while (1)
{
for(i=1;i<=n2;i++)
P(Sin[i]);
P(mutex);
将数据放入缓冲区i
i = (i + 1) % m;
V(mutex);
for(i=1;i<=n2;i++) V(Sout[i]);
}
Bi:
while (1)
{
P(Sout[i]);
P(mutex);
从缓冲区readnum[i]取数
readnum[i] = (readnum[i] + 1) % m;
V(mutex);
V(Sin[i]);
};
- 复杂的消息缓冲问题PV
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- win2003r2 的pv debug信息显示问题
- 对PV操作问题的理解综合
- 复杂问题的调试
- 复杂的抽签问题
- 解决real缓冲的问题
- 双缓冲还闪屏的问题
- 双缓冲还闪屏的问题
- printf 缓冲机制的问题
- 图片的三级缓冲问题
- 缓冲技术之一:缓冲问题的来源和解决方法
- MFC 消息缓冲
- 消息缓冲机制
- 缓冲问题
- SSDP(简单服务发现协议)
- java打包命令
- ASP.NET页面传值的各种方法和分析
- ZeroMemory、memset和 “={0}” 的区别
- pat_1034
- 复杂的消息缓冲问题PV
- 最近的论文进展
- OS X 键盘快捷键
- 孙鑫MFC:Lesson 4
- 集合总结1
- iptables 使用方法
- ASP.NET状态管理之一(概括篇)
- Python3 抓取网页中的图片
- 关于访问控制权限和继承方式