我在互联网上搜索了第一个在系统启动时执行的进程。
我找到了两个init
和sched
的答案。真的是什么?
首先执行哪个? sched
流程或init
流程?
答案 0 :(得分:13)
通常它是init
进程,其路径被硬编码到内核本身。 init
执行非常低级的功能,例如在Ubuntu(15.40之前)的情况下启动upstart
或在Ubuntu 15.04及更高版本的情况下启动systemd
,Arch,Fedora和其他加载剩余的进程和设置。请注意,init
运行时系统未完成启动 - 这是一种常见的误解。事实上,init
设置了您的登录屏幕和其他相关任务。这是init
上的WikiPedia页面:https://en.wikipedia.org/wiki/Linux_startup_process#SysV_init
Init是所有进程的父亲。它的主要作用是从存储在文件/ etc / inittab中的脚本创建进程。此文件通常具有导致init在用户可以登录的每一行上生成gettys的条目。它还控制任何特定系统所需的自治进程。运行级别是系统的软件配置,其仅允许存在选定的一组进程。 init为每个运行级别生成的进程在/ etc / inittab文件中定义。
然而,Linux内核确实启动调度程序,但它不在用户空间中,这是大多数人关联的进程的主页。此外,如果/bin/sh
丢失或无法调用,则可以替换Bourne Shell(init
)。理论上,您还可以使用init=*some path here*
Linux内核引导选项将其替换为任何可执行文件。
答案 1 :(得分:6)
其sched
,根据Linux 3.13 start kernel()首先调用sched_init()并运行第一个用户空间进程init,即rest_init()创建一个内核线程传递另一个函数kernel_init()除非被调用,否则作为入口点和内核将进入空闲状态。
start_kernel() {
...
sched_init();
rest_init(); calls function kernel_init();
}
答案 2 :(得分:2)
内核至少有一个可运行的进程,称为idle task,swapper,init_task和sched。 它们是pid为0 的同一进程的不同名称。这个init_task是内核的全局变量,所以它有一个固定的地址,你可以通过命令grep 'D init_task' /boot/System.map-*
从System.map看到它。除非重新编译内核,否则地址不会改变。
程序 init ,其pid为1,由init_task(pid 0)生成。在Ubuntu中,程序 init 是Upstart进程管理守护程序,而在其他系统中,它可以是systemd。每次系统重启时,init的地址都会改变。
因此,首先运行流程0,然后生成流程1.
答案 3 :(得分:1)
你可以尝试
pstree 0
它将以sched
进程(PID 0)上的子项显示树形式的所有进程层次结构。毫无疑问,init
是所有流程的父级,但sched
会在init
之前执行,并同时生成init
和kthread
。
您还可以使用以下方式查看PPID(即父进程的进程ID)。
ps -eaf
您会注意到init
和kthread
都是0。
答案 4 :(得分:0)
Swapper是第一个运行的进程。它有pid 0。