有效的睡眠方式?

时间:2014-05-28 00:16:25

标签: c++ performance sleep

我正在开发一个简单的C ++应用程序来进行一些网络连接。我需要它通过Internet将UDP数据包发送到另一个应用程序,但为了防止任何拥塞,我需要以特定的速度调整发送速率。因此,我需要我的程序在两个连续的数据包之间休眠。 usleep()函数看起来是一个不错的选择,但是对于合理快速的连接,我会在很短的时间内进入睡眠状态,大小为微秒。即使对于这些速率,它实际上工作得相当好,但我注意到它在CPU方面的成本很高。举个例子,我试着做到这一点:

while(true) usleep(100);

这只是在睡眠命令上循环,每次100微秒,对吗?现在,CPU速度大约为GHz,因此100微秒意味着睡眠时间比时钟速度大5个数量级。但这只会占用我CPU使用率的10%。

那又怎样?难道我做错了什么?我通过设置更宽的间隔并以小批量发送数据包来解决这个问题,但是我想知道是否有合理有效的替代方案可以让我们在很短的时间内睡觉。

非常感谢!

2 个答案:

答案 0 :(得分:3)

就规范而言,没有人知道如何实施usleep。现在在实践中你可以查看代码以确定它实际上是什么,但在我的回忆中它是一个旋转检查。你不能期望睡眠的时间少于一个内核滴答。因此大约10毫秒,即10000微秒。睡眠CPU意味着在所需的唤醒时间编程中断,这通常是昂贵的,并且无法在100微秒内完成,因此旋转。

答案 1 :(得分:0)

您考虑过Datagram Congestion Control Protocol了吗?它的标准化建议为RFC4340,您可以找到现有的实现,而不是尝试实现自己的拥塞控制。

另请查看http://www.read.cs.ucla.edu/dccp/以了解实施情况和更多链接。