有效的睡眠方式

Efficient ways to sleep?

本文关键字:方式 有效      更新时间:2023-10-16

我正在开发一个简单的c++应用程序,它可以进行一些网络连接。我需要它通过Internet向另一个应用程序发送UDP数据包,但是为了防止任何拥塞,我需要将发送速率调整为特定的速度。因此,我需要我的程序在两个连续发送的数据包之间休眠。ussleep()函数看起来是一个不错的选择,但是对于相当快的连接,我的睡眠时间非常短,以微秒为数量级。即使在这些速率下,它实际上也能很好地工作,但我注意到它在CPU方面付出了巨大的代价。作为一个例子,我尝试这样做:

while(true) usleep(100);

这只是循环一个sleep命令,每100微秒,对吗?现在,CPU的速度是在GHz的数量级,所以100微秒意味着睡眠时间比时钟速度大5个数量级。但是仅仅这样就消耗了10%的CPU使用率。

那又怎样?我做错了什么吗?我通过设置更宽的间隔和以小系列发送数据包来解决这个问题,但尽管如此,我想知道是否有合理有效的替代方法来代替ussleep,以便在短时间内睡觉。

非常感谢!

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

您考虑过数据报拥塞控制协议吗?它被提议作为RFC4340的标准化,你可以找到现有的实现,而不是试图实现你自己的拥塞控制。