有效的睡眠方式
Efficient ways to sleep?
我正在开发一个简单的c++应用程序,它可以进行一些网络连接。我需要它通过Internet向另一个应用程序发送UDP数据包,但是为了防止任何拥塞,我需要将发送速率调整为特定的速度。因此,我需要我的程序在两个连续发送的数据包之间休眠。ussleep()函数看起来是一个不错的选择,但是对于相当快的连接,我的睡眠时间非常短,以微秒为数量级。即使在这些速率下,它实际上也能很好地工作,但我注意到它在CPU方面付出了巨大的代价。作为一个例子,我尝试这样做:
while(true) usleep(100);
这只是循环一个sleep命令,每100微秒,对吗?现在,CPU的速度是在GHz的数量级,所以100微秒意味着睡眠时间比时钟速度大5个数量级。但是仅仅这样就消耗了10%的CPU使用率。
那又怎样?我做错了什么吗?我通过设置更宽的间隔和以小系列发送数据包来解决这个问题,但尽管如此,我想知道是否有合理有效的替代方法来代替ussleep,以便在短时间内睡觉。
非常感谢!
就规范而言,没有人知道ussleep是如何实现的。现在在实践中,你可以查看代码来确定它实际上是什么,但在我的记忆中,它是一个旋转检查。你不能期望睡眠的时间少于一个内核周期。因此大约是10毫秒,也就是10000微秒。休眠CPU将意味着在期望的唤醒时间编程中断,这通常是昂贵的,不能在100微内完成,因此旋转。
您考虑过数据报拥塞控制协议吗?它被提议作为RFC4340的标准化,你可以找到现有的实现,而不是试图实现你自己的拥塞控制。
相关文章:
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何以更有效的方式检查一个数字是否是素数?
- 为什么以这种方式使用迭代器有效?
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 以有效的方式从 Node .js运行 C 或C++代码
- 在这种情况下,如何以有效的方式使用模板
- 可能以有效的方式在模拟的循环中进行多线程
- 更有效的填充unordered_set方式?
- 如何以有效的方式将输入参数传递给函数
- 如何使用C 以有效的方式产生随机数
- 以有效的方式查找一组边中的现有圆
- 在 OpenGL 中渲染对象的哪种方式更有效
- 在哪种方式搜索容器中的元素的方式更有效
- 算法找到最有效的并行发送数据的方式
- 如何以有效的方式使用boost mpi广播功能
- 将int重新解释为float的最有效的标准兼容方式
- 在不使用专用语法的情况下,为不同类型的不同方式实现模板类的方法是否有效C++?
- 以最有效的方式比较两个向量
- 以嵌套或递归方式(即在处理程序内)调用 asio io_service poll() 或 poll_one() 是否有效