内核是一个进程吗?


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

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

Answers:


19

简短的答案:

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

初始化只是第一步。它不管理任何进程或线程。它确实使用内核syscalls fork()和exec创建了一些对象。

我认为您对流程是什么有一个模糊的想法。这不仅意味着要执行一些代码。是的,内核在初始化之前执行(甚至在启动加载程序之前执行)。但是“过程”具有以下特定定义:

  • 在用户空间中运行
  • 以进程ID运行
  • 许多交互都需要通过内核
  • 所有资源都必须来自内核
  • 需要由内核安排

因此,一旦内核初始化,它将运行init,然后产生其配置所说明的其他进程。

就#2而言,所有内核内容都在内核中。将内核视为大范围的代码。同样,这不是一个过程,而是一个很大的代码blob。内核的一部分用于内存管理,一部分用于调度自身的部分(如驱动程序等),一部分用于调度过程。


3
我想知道OP是否足够了解微内核的知识?我没有将其包括在我的编辑中,因为我认为它无论如何都会分散注意力。
new123456 2011年

4
内核的一种思考方式就像一个巨大的库,带有入口点(系统调用),要求它代表您做某事。另一种互补的观点是,它坐着等待事件处理,无论是来自用户的系统调用还是硬件中断(例如,新的网络数据包到达)。有些东西需要花费一些时间来处理,因此内核只是将工作交付给内部线程,然后返回给被叫者。
vonbrand 2013年

15

内核实际上根本不像一个进程。它没有被调度,它可以代表进程运行(所谓的进程上下文或用户上下文),也可以作为中断或异常的结果运行(所谓的中断上下文)。

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

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


1

微内核中存在一些概念,其中内核的各个部分确实是进程,而主要标记通常只是管理IPC。

Linux(无论好坏)不是微内核系统。


1

不,不是...内核(和内核扩展)直接加载到内存中。如果内核中存在不安全的代码,那么它与大麻烦之间就没有关系了。

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

(tl; dr 1.否2.内核部分/扩展名)


0

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

好吧,有一个空闲进程(基本上是pid 0,尽管未在任何地方显示),它是经过调度的,并且始终处于可运行状态。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.