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

标签 linux vmware virtual-machine solaris-10

我有一个用 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/

相关文章:

usb - 通过 USB 内存棒携带和操作整个开发盒。可行的?

windows - Windows开发用虚拟机用什么软件?

azure - 重新部署 Azure 虚拟机

assembly - 在 x86-32 处理器上运行 x86-64 ASM

linux - NOHZ : local_softirq_pending 100

linux - 使用 bash 判断是否安装了具有给定 UUID 的驱动器

linux - 为什么系统启动后立即停止服务?

virtual-machine - 如何修复 VMware fusion 导入现有机器 (cloudera) 变灰的问题?

node.js - 在单个 Azure VM 上运行两个 Nodejs 服务器

Linux bash : Use awk(substr) to get parameters from file input