内核是进程吗?

32 linux kernel

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

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

Ric*_*lka 20

简短的答案:

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

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

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

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

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

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

  • 对内核的一种思考方式就像一个巨大的库,有入口点(系统调用)来要求它代表您做某事。另一个补充观点是,它等待处理事件,无论是来自用户的系统调用还是硬件中断(例如,新的网络数据包到达)。有些事情需要时间来处理,所以内核只是将工作发送到内部线程并返回给调用者。 (5认同)
  • 我想知道 OP 是否有足够的知识让他的思想被微内核震撼?我没有把它包括在我的编辑中,因为我认为无论如何它都会分散注意力。 (3认同)

nin*_*alj 18

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

也就是说,Linux 内核会产生内核线程来执行某些任务,或者避免在中断上下文中运行某些内容过长的时间(这就是 ksoftirqd 线程所做的,避免可能导致的过度延迟,例如:丢失音频,...) .

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


Aur*_*ílý 1

不,不是......内核(和内核扩展)直接加载到内存中。如果内核中存在不安全代码,那么没有什么可以阻止它和大麻烦。

除此之外,内核基本上在进程之间执行/切换。显然,实际运行进程的东西本身并不是进程。

(tl;dr 1. no 2. 内核/其扩展的一部分)