2013-11-28 59 views
0

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

+2

“默认情况下,Linux以循环方式运行。”不,默认调度程序不是简单的循环调度程序。但请注意,您很少需要在守护进程中进行睡眠。相反,您想等待某件事 - 例如观察事件的文件描述符(使用选择/投票) – nos

+0

是的,投票和睡眠是一个非常糟糕的计划(除非在每分钟投票次数少于一次的情况下)。相反,循环应该等待一些消息或事件 - 不需要实际睡眠,因为等待会更好地完成同样的事情。 –

回答

-1

睡眠迫使os将执行传递给另一个线程,因此是有帮助的,或者至少是公平的。从睡眠开始。应该可以。

+0

为什么downvote,这个声明有什么问题? – icbytes

+1

不是我的失望,但我可以解释。所有sleep(1)循环中的99.99%是可避免引入的CPU浪费和延迟。像@usr在上面解释的那样,线程应该做有用的工作或者根本不运行(即阻塞I/O或线程间信号)。 –

1

如果您的程序有用,请不要扼杀它。一个程序可以通过阻止像IO等东西来移出运行队列。

如果你正在编写一个可以旋转任意次数的轮询循环,你可能想用sleep来调节一下,因为旋转经常没有什么价值。

也就是说,轮询循环是最后手段。通常情况下,程序对每条指令执行有用的工作,所以他们根本不会睡觉。

+0

你能否详细说明IO和等待操作? –

+0

当一个线程从一个文件读取时,它必须阻塞,直到字节可用。在那段时间内核会去除线程。一个磁盘读取了一些内容,它会通过中断通知内核IO已完成。然后内核将标记等待的线程再次准备好。 – usr

+0

即使我正在写文件时,这是否为真?当我写和冲洗它。内核将有时间安排其他工作。 –

0

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

通常你所做的就是调用一个阻塞函数,当你需要做某些事情时它会唤醒你。

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

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

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

而是有点像这样:

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

有内核你入睡,直到有实际要做的工作。实现起来并不难,你会更加高效(不会从别人那里窃取CPU时间,只是浪费它不做实际的工作),并且响应延迟也会下降。