linux - 在Linux中,以认真的方式进行轮询

标签 linux scheduling polling

当你有一个紧密的循环来轮询某些东西的状态时,我不太确定如何在不妨碍其他想要使用 CPU 的进程的情况下进行轮询。例如,这样做:

while (state == BUSY) state = check_state();

看起来像是浪费资源。我认为最好的方法是:

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

我希望 top 会将进程列为 sleep 进程,即使它在执行此操作时确实消耗了 100% 的 CPU。这样,该过程将(我希望)“很好地”进行轮询。但事实并非如此。目前我有

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

这是完全可以接受的,但我觉得还可以做得更好。这样做有标准做法吗?

最佳答案

不要使用 sched_yield(),它会严重扰乱调度程序的优先级检测,即使从性能角度来看它具有良好的互操作性,也会造成电池生命周期和功耗指标等问题。如果您的应用程序可以容忍延迟,那么超时轮询(即使是像 10Hz 这样的短轮询)也是非常可取的,尽管仍然不理想。

正确的答案取决于 check_state() 实际需要做什么。您绝对确定您无法安排一些事情,以便您的状态更改成为您可以阻止的内核可见事件吗?

关于linux - 在Linux中,以认真的方式进行轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1533441/

相关文章:

c - ELF 格式操作

linux - omn​​etpp 矢量在 linux 和 windows 上录制

java - Apache Camel-Quartz 集成

对 poll() 和 recvfrom() 的混淆

Git/Jenkins 轮询忽略提交而不忽略目录

linux - 如何在运行期间评估 shell 输出并据此制定条件?

c - 服务数据库文件和 getservbyname_r() 函数

algorithm - 简单最大利润调度算法

java - 静态和动态调度的优点和缺点

C# - 从客户端检查 TCP/IP 套接字状态