有界缓冲区(生产者消费者)

时间:2012-03-06 04:47:08

标签: operating-system buffer

在共享缓冲区内存问题中,为什么我们可以在缓冲区中同时拥有最多(n-1)个项目。

其中'n'是缓冲区的大小。

谢谢!

3 个答案:

答案 0 :(得分:3)

在大学的操作系统开发课程中,我有一位兼职教师声称不可能拥有一个只能使用缓冲区中所有N个元素的纯软件解决方案。 我证明他错了我决定称之为赛道解决方案(受到我喜欢跑道的启发)。

在赛道上,您不仅限于400米比赛;比赛可以包括一圈以上。如果两个跑步者是颈部和颈部会发生什么 在比赛中?你怎么知道他们是否被束缚,或者一个跑步者是否已经打了另一个?答案很简单:在比赛中,我们不监控跑步者的位置 在轨道上;我们监控每个跑步者所经过的距离。因此,当两个跑步者是颈部和颈部时,我们可以在一个领带和一个跑步者之间消除歧义 把对方舔了一下。

因此,我们的算法有一个N元素数组,并管理一个2N竞赛。在他们完成各自的2N比赛之前,我们不会重新启动生产者/消费者的计数器。 我们不允许生产者超过消费者超过一圈,我们不允许消费者领先于生产者。 实际上,我们只需要监控生产者和消费者之间的距离。

代码如下:

Item track[LAP];
int consIdx = 0;
int prodIdx = 0;

void consumer()
{ while(true)
  { int diff = abs(prodIdx - consIdx);
    if(0 < diff) //If the consumer isn't tied
    { track[consIdx%LAP] = null;
      consIdx = (consIdx + 1) % (2*LAP);
    }
  }
}

void producer()
{ while(true)
  { int diff = (prodIdx - consIdx);
    if(diff < LAP) //If prod hasn't lapped cons
    { track[prodIdx%LAP] = Item();      //Advance on the 1-lap track.
      prodIdx = (prodIdx + 1) % (2*LAP);//Advance in the 2-lap race.
    }
  }
}

自从我最初解决问题以来已经有一段时间了,所以这是根据我最好的回忆。希望我没有忽视任何错误。 希望这有帮助!

答案 1 :(得分:1)

哎呀,这是一个错误修复:

Item track[LAP];
int consIdx = 0;
int prodIdx = 0;

void consumer()
{ while(true)
  { int diff = prodIdx - consIdx;         //When prodIdx wraps to 0 before consIdx,
    diff = 0<=diff? diff: diff + (2*LAP); //think in 3 Laps until consIdx wraps to 0.
    if(0 < diff) //If the consumer isn't tied
    { track[consIdx%LAP] = null;
      consIdx = (consIdx + 1) % (2*LAP);
    }
  }
}

void producer()
{ while(true)
  { int diff = prodIdx - consIdx;
    diff = 0<=diff? diff: diff + (2*LAP);
    if(diff < LAP) //If prod hasn't lapped cons
    { track[prodIdx%LAP] = Item();      //Advance on the 1-lap track.
      prodIdx = (prodIdx + 1) % (2*LAP);//Advance in the 2-lap race.
    }
  }
}

答案 2 :(得分:0)

好吧,从理论上讲,有界缓冲区可以保存元素大小。但是你所说的可能与某些实现怪癖有关,比如找出缓冲区空/满时的干净方法。这个问题 - &gt; Empty element in array-based bounded buffer处理类似的事情。看看它是否有帮助。

但是,您当然可以实现填充所有n个插槽的实现。无论如何,这就是有界缓冲区问题的定义方式。