与Solaris 10计算机相比,无限循环内的select()在RHEL 4.8虚拟机上使用的CPU多得多
收藏

我有一个用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()调用的time参数来返回剩余时间,而solaris则不返回。这意味着,不知道posix规范的程序员可能不会在调用select之间重置time参数。
这将导致第一个调用有1000个usec超时,而所有其他调用使用0个usec超时。

公众号