在一次采访中,我被问到了一个有趣的问题:
假设您不断地从一个源接收一些字节流(让我们假设一个客户机-服务器模型),其速率是可变的。你想在你的终端对数据包进行排序,然后以恒定的速率将它们重新传输到其他地方。您将如何在C++中实现这样的系统?
我提供了一个基本系统,一个工作线程将包推到堆中,调度员线程弹出排序的数据包,并将它们与某个内部时钟同步发送出去,时间间隔为X。
面试官合理地认为,由于线程之间的上下文切换,这样的系统很容易错过重传的最后期限。我回答说,如果没有对特定机器中的线程调度算法的任何控制,我就无法保证恒定的重传速率。他坚持下去,这让我觉得我可能错了,这实际上是可以实现的。那我是吗?
发布于 2016-05-01 22:04:28
对问题的描述太模糊了。“分类”是什么意思?数据包体内是否有某种序列号?如果我们从来没有收到带有序列号的数据包呢?以下是我对一些通用算法的想法,这些算法可以适应不同的具体情况。
参数
算法取决于以下参数:
变量
首先,我们需要一个固定长度的环形缓冲器。环形缓冲器包括:
我们还需要存储全局变量--下一个要发送的序列号。
算法
当数据包到达时,我们将数据包添加到适当的位置(插入排序的一个步骤),因此我们的缓冲区总是按序列号排序。在此之后,如果至少有下列一项是正确的,我们可能希望从缓冲区的头发送数据包:
如果以上至少有一个是正确的,我们发送头包并从缓冲区中删除它。我们还将预期的序列号分配为发送数据包的seq号加上一个。如果在发送头数据包后,缓冲区不是空的,我们也(重新)用TTL值启动计时器。当计时器被触发时,我们执行相同的检查。这是为了避免将数据包无限期地保存在缓冲区中(以防没有更多的传入数据包)。
https://stackoverflow.com/questions/36971575
复制相似问题