Linux0号进程的静态创建
Linux0号进程的静态创建
- 一、引言
- 二、静态创建的含义
- 三、静态创建的特点
- 1. 编译时确定
- 2. 无需额外的系统调用
- 3. 初始化顺序固定
- 四、与动态创建的对比
- 1. 动态创建
- 2. 对比总结
一、引言
linux启动的第一个进程是0号进程,是静态创建的,称为idle进程或者swapper进程。
在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。
1号进程最终会使用execve函数去调用可init可执行文件,init进程最终会去创建所有的应用进程,所以被称为inti进程。
2号进程会在内核中负责创建所有的内核线程,被称为kthreadd进程。
所以说0号进程是1号和2号进程的父进程;1号进程是所有用户态进程的父进程;2号进程是所有内核线程的父进程。
最近在学习Linux操作系统的相关知识,看到上述内容不由得疑惑:什么是静态创建?于是产生了这篇博客
在 Linux 内核启动过程中提到的“静态创建”是相对于动态创建而言的,下面详细解释其含义
二、静态创建的含义
静态创建指的是在编译内核时就将进程相关的数据结构和初始化代码硬编码到内核镜像中,而不是在运行时通过常规的系统调用(如 fork()
等)来创建进程。对于 Linux 内核中的 0 号进程(idle 进程或 swapper 进程),它是在内核启动阶段由内核代码直接初始化和创建的,不依赖于运行时的动态分配和创建机制。
三、静态创建的特点
1. 编译时确定
静态创建的进程信息在编译内核时就已经确定,其数据结构(如进程控制块 task_struct
)的内存布局和初始值都被预先定义好并嵌入到内核二进制文件中。例如,0 号进程的初始状态、优先级、寄存器值等信息在编译时就已经被设置好,内核启动时直接使用这些预设值来初始化进程。
2. 无需额外的系统调用
与动态创建进程不同,静态创建不需要通过专门的系统调用(如 fork()
或 clone()
)来创建新进程。因为它是内核代码的一部分,在内核启动过程中直接按照预定的逻辑进行初始化,减少了系统调用带来的开销和复杂性。
3. 初始化顺序固定
静态创建的进程通常有固定的初始化顺序,这是由内核代码的执行流程决定的。例如,Linux 内核启动时首先会创建 0 号进程,然后由 0 号进程创建 1 号进程和 2 号进程,这种顺序是在编译内核时就确定好的,确保了内核启动的稳定性和一致性。
四、与动态创建的对比
1. 动态创建
动态创建是指在系统运行过程中,通过系统调用(如 fork()
、clone()
等)来创建新的进程。这些系统调用会在内核中分配新的进程控制块、复制父进程的资源,并将新进程加入到调度队列中。动态创建的进程可以根据程序的运行逻辑和需求灵活地创建和销毁,适用于各种动态的应用场景。
2. 对比总结
对比项 | 静态创建 | 动态创建 |
---|---|---|
创建时机 | 编译时确定,内核启动阶段创建 | 系统运行时根据程序需求创建 |
创建方式 | 内核代码直接初始化,无需系统调用 | 通过系统调用(如 fork() 、clone() )创建 |
灵活性 | 低,创建顺序和参数固定 | 高,可以根据程序逻辑灵活创建和销毁 |
适用场景 | 内核启动过程中创建关键进程(如 0 号进程) | 应用程序中动态创建子进程执行任务 |
综上所述,静态创建是 Linux 内核启动过程中一种特殊的进程创建方式,它为内核的初始化和稳定运行提供了基础,确保了关键进程能够按照预定的顺序和参数被正确创建。