linux – select()内部无限循环在RHEL 4.8虚拟机上使用的CPU比在Solaris 10机器上多得多
作者:互联网
我有一个用C编写的守护程序应用程序,目前在Solaris 10计算机上运行时没有已知问题.我正在将其移植到Linux上.我不得不做出微小的改变.在测试期间,它通过所有测试用例.它的功能没有问题.但是,当我在Solaris计算机上“空闲”时查看其CPU使用情况时,它使用了大约.03%的CPU.在运行Red Hat Enterprise Linux 4.8的虚拟机上,相同的进程使用所有可用的CPU(通常在90%范围内的某个位置).
我的第一个想法是事件循环必定出错.事件循环是一个无限循环(while(1)),调用select().设置timeval以便timeval.tv_sec = 0和timeval.tv_usec = 1000.这对于进程正在进行的操作似乎足够合理.作为测试,我将timeval.tv_sec提升为1.即使这样做,我也看到了同样的问题.
关于select如何在Linux与Unix上运行,我有什么遗漏吗?或者它与在虚拟机上运行的OS有何不同?或者也许还有其他我完全错过的东西?
还有一件事我不确定使用哪个版本的vmware服务器.它刚刚在一个月前更新了.
解决方法:
我相信Linux会将剩余时间写入select()调用的time参数,而Solaris则不会.这意味着不了解POSIX规范的程序员可能不会重置select之间的时间参数.
这将导致第一次调用具有1000次usec超时,并且所有其他调用使用0 usec timeout.
标签:linux,virtual-machine,vmware,solaris-10 来源: https://codeday.me/bug/20190827/1741343.html