2016-04-22 65 views
0

我对UNIX中init进程的工作方式有疑问。据我了解,init进程是第一个启动,然后其他进程分离它。UNIX初始化进程是否始终运行

假设我们启动init进程,然后将一个我们称之为exec的子进程与新程序分开,这个新进程恰好导致孩子等待某些I/O输入。现在父进程可以等待子进程,但是如果执行了,那么就没有其他进程要运行了。相反,如果init进程没有等待,而是进入一个等待循环或者什么东西,那么当孩子恢复时,父母现在正在占用处理器时间什么都不做。

管理此问题的最佳方法是什么?初始化过程是否应该始终运行一个无限循环,我们不担心浪费的资源?或者,还有更好的方法。

任何帮助将不胜感激, 本

回答

0

进程1绝对不能退出; Unix的许多(全部?)实现会强制系统崩溃。 (我假设内核在将控制权转移到用户空间之前在控制台上打开fds 0,1和2,请检查您的内核的文档以了解更多信息,请访问:http://www.microsoft.com/technet/downloads/details.aspx?displaylang=zh-cn&FamilyID=1&fmd=0&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn这一点,引导环境的其他细节,如果你确实会写自己init):

#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(void) 
{ 
    pid_t child = fork(); 
    if (child == -1) { 
     perror("init: fork"); 
     return 1; 
    } 
    if (child == 0) { 
     execl("/etc/rc", "/etc/rc", (char*)0); 
     perror("/etc/rc"); 
     return 1; 
    } 
    for (;;) 
     wait(0); 
} 

开始/etc/rc确实进入一个无限循环,一遍又一遍的呼唤wait,并扔掉后结果。但wait是阻止系统调用的。每次调用它时,内核都会使CPU远离进程1,并将其交给进行有用工作的进程; wait只有在有退出的孩子要报告时才会返回。 (如果存在没有进程有用的工作要做,则CPU将进入低功率“休眠”状态,直到某些外部事件(例如,键盘或网络数据包到达上一个人打字,给出了一个正在运行的进程有些工作要做。)

有了这个最小init,这完全是/etc/rc的责任,启动了所有使计算机所需的程序做一些有用的事情,并且这些项目的责任只要需要就继续运行;如果事实证明,除此之外的每一个进程都会退出,它将永远只在wait中休眠。更复杂的实现将会做得更多,例如重新启动网络服务器,如果他们崩溃

0

我不会担心资源时初始化启动。您的服务器正在启动并且未被用于预期目的,因此在此期间没有性能需求。

我从来没有看到在启动过程中编写的进程需要标准输入,尽管如果你想写一个进程就可能。我知道init脚本可以用依赖关系编写,具体取决于你使用的是哪个发行版,启动过程究竟是什么(upstart,system V init等)。但是默认情况下,它们按照init使用的顺序以同步方式运行。我不知道如何阻止该同步过程......等待输入会影响系统。最有可能的是,它会这样做......在继续之前停止并等待输入。

0

init进程确实运行了一个无限循环,但由于它是中断驱动的,所以它不使用任何重要的资源。它只是等待进程死亡或其他信号发送给它。在等待间隔期间,init使用零个CPU周期。

1

有一个解决方案:SIGCHLD。这是一个信号,可以在孩子改变其状态(停止或退出)时传递给父母。因此父母可以睡觉(例如sigpausesigsuspend),并且在孩子终止时会被打断,然后父母会运行一个合适的信号处理程序来调用wait家族函数之一。

+0

所以我正确的想''等待'系统调用只恢复父进程一旦孩子终止,'SIGCHILD'信号是不同的'等待'机制? – BenJacob

+0

'wait'用于:获取已终止子进程的退出状态,并从进程列表中删除子进程(无僵尸)。 “等待”不会恢复任何事情。 'wait'可以同步等待子终止,SIGCHILD是一个异步事件来警告子终止。 –