内核是一个进程吗?

内核是一个进程吗?
  1. 在 Linux 中,我们总是说第一个进程是init(pid==1)。但是为什么不是启动系统并创建 init进程的内核 (启动)。内核是进程吗?
  2. 我们知道所有用户空间线程都植根于 init 进程。那么调度程序和其他内核内容(如内存管理)又如何呢?

基本上让我困惑的是内核的结构。如果它是一个进程,那么它是一个单个进程,还是由多个进程组成?

答案1

简短的答案:

  1. 不,这不是一个过程
  2. 用户线程不是以 init 为根的。

Init 只是第一个进程;它不管理任何进程或线程。它使用内核系统调用 fork() 和 exec 创建一些进程或线程。

我认为你对进程的概念很模糊。它不仅仅意味着一些执行代码。是的,内核在 init 之前执行(引导加载程序甚至在此之前执行)。但是“进程”有特定的定义:

  • 在用户空间运行
  • 使用进程 ID 运行
  • 许多交互需要通过内核
  • 所有资源都需要来自内核
  • 需要由内核调度

因此,一旦内核初始化,它就会运行 init,然后生成其配置所要求的任何其他进程。

就第 2 条而言,所有内核内容都在内核中。将内核视为一大段代码。同样,不是进程,而是一大段代码。内核的一部分处理内存管理,一部分处理自身的调度部分(如驱动程序等),另一部分处理进程调度。

答案2

内核的行为实际上根本不像进程。它不会被调度,它要么代表进程运行(所谓的进程上下文或用户上下文),要么作为中断或异常的结果运行(所谓的中断上下文)。

也就是说,Linux 内核会生成内核线程来执行某些任务,或者避免在中断上下文中运行某些操作太长时间(这就是 ksoftirqd 线程所做的,避免可能导致音频丢失等的过长延迟)。

您可以在命令的输出中看到内核线程ps。它们很容易识别:它们的名称位于括号内。其中一些线程在每个 CPU 上运行一个实例,CPU 用斜杠后的数字标识,因此 [ksoftirqd/0] 是 CPU 0 上的 ksoftirqd 实例。

答案3

微内核中存在这样的概念:内核的各个部分实际上是进程,而主哨兵主要仅管理 IPC。

Linux——无论好坏——都不是一个微内核系统。

答案4

ninjalj 写道:“内核实际上根本不像进程。它没有被调度,”

嗯,有一个空闲进程(基本上是 pid 0,尽管它没有显示在任何地方),它已被调度并且几乎始终处于可运行状态。

相关内容