gpt4 book ai didi

linux - 无限循环内的 select() 在 RHEL 4.8 虚拟机上使用的 CPU 明显多于在 Solaris 10 计算机上

转载 作者:可可西里 更新时间:2023-11-01 11:48:00 26 4
gpt4 key购买 nike

我有一个用 C 编写的守护程序应用程序,目前正在 Solaris 10 机器上运行,没有已知问题。我正在将它移植到 Linux。我不得不做最小的改变。在测试期间,它通过了所有测试用例。它的功能没有问题。但是,当我在我的 Solaris 机器上“空闲”时查看它的 CPU 使用率时,它使用了大约 0.03% 的 CPU。在运行 Red Hat Enterprise Linux 4.8 的虚拟机上,同一进程使用所有可用的 CPU(通常在 90% 以上的范围内)。

我的第一个想法是事件循环一定有问题。事件循环是一个无限循环 (while(1)),调用 select()。 timeval 设置为 timeval.tv_sec = 0timeval.tv_usec = 1000。对于进程正在做的事情,这似乎足够合理。作为测试,我将 timeval.tv_sec 设置为 1。即使在这样做之后我也看到了同样的问题。

关于 select 在 Linux 和 Unix 上的工作方式,我是否遗漏了什么?或者它与虚拟机上运行的操作系统的工作方式不同吗?或者也许还有其他我完全想念的东西?

还有一件事我不确定正在使用哪个版本的 vmware 服务器。不过,它大约在一个月前才更新。

最佳答案

我相信 Linux 会通过将剩余时间写入 select() 调用的时间参数来返回剩余时间,而 Solaris 不会。这意味着不了解 POSIX 规范的程序员可能不会在调用 select 之间重置时间参数。

这将导致第一个调用有 1000 usec 超时,所有其他调用使用 0 usec 超时。

关于linux - 无限循环内的 select() 在 RHEL 4.8 虚拟机上使用的 CPU 明显多于在 Solaris 10 计算机上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2435449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com