在Linux中运行永久进程时我们是否需要sleep()?

时间:2013-11-28 12:48:06

标签: linux multithreading linux-kernel

我已经读过像守护进程一样的永久进程应该在while(1)或for(;;)循环中使用sleep()运行。他们说,这是必需的,因为否则这个进程将始终在运行队列中,内核将始终运行它。这将阻止其他进程。我不同意它会完全阻止其他进程。如果有时间切片,那么它将执行其他过程。但是,肯定会从其他人那里偷走时间。延迟其他进程,因为此进程始终处于运行状态。默认情况下,Linux作为循环运行。第一个任务是swapd,然后是其他任务。这是一个循环链接列表,第一个任务为swapd(process-id为0),然后是其他任务。我相信这仍然是基于时间切片。每个流程的特定时间。这些任务只是进程描述符。我相信这个链接列表是由init进程维护的。如果我错了,请在这里纠正我。其他问题是,如果我们需要给睡眠()然后应该是什么值?我们如何确定睡眠值以获得最佳效果?

3 个答案:

答案 0 :(得分:1)

如果您的程序有用,请不要限制它。程序可以通过阻塞诸如IO之类的东西并等待来移出运行队列。

如果您正在编写一个可以旋转任意次数的轮询循环,您可能希望使用sleep稍微限制它,因为过于频繁地旋转几乎没有价值。

也就是说,投票循环是最后的手段。通常情况下,程序会对每条指令执行有用的工作,因此它们根本不会睡觉。

答案 1 :(得分:0)

睡眠几乎肯定是错误的解决方案。

通常你所做的就是一个阻止函数,当你有什么东西可以把它叫醒时。

例如,如果您是网络服务,则您希望在请求到达之前保持非活动状态。

换句话说,守护程序的核心不应该是这样的:

while(1)
{
    if (checkIfSomethingToDo())
        doSomething();
     else
         sleep(1);
}

但有点像这样:

while(1)
{
    int ret = poll(fds, nfds, -1);
    if (ret > 0)
        doSomething();
}

让内核让你睡觉,直到有实际的工作要做。它并不难实现,你的效率会更高(不会浪费其他人的CPU时间,只会浪费它不做任何实际的工作),你的响应延迟也会下降。

答案 2 :(得分:-1)

睡眠强制操作系统将执行传递给另一个线程,因此是有帮助的,或者至少是公平的。从睡眠开始。应该没问题。