在共享缓冲区内存问题中,为什么我们可以在缓冲区中同时拥有最多(n-1)个项目。
其中'n'是缓冲区的大小。
谢谢!
答案 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个插槽的实现。无论如何,这就是有界缓冲区问题的定义方式。