复杂的消息缓冲问题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]);

   };

原创粉丝点击