gpt4 book ai didi

process - 内核是否会产生一些在后台继续运行的进程(而不是用户进程)?

转载 作者:行者123 更新时间:2023-12-03 08:04:16 25 4
gpt4 key购买 nike

我正在学习操作系统的概念。这是我学到的一部分:内核是操作系统的关键部分,它执行许多关键的操作,例如内存管理、作业调度等。

这是我正在思考并感到困惑的部分:为了让操作系统按预期运行,从某种意义上说,内核需要保持运行,也许在后台运行,因此它始终能够响应不同的系统调用和中断。为了实现这一目标,我想到了两种完全不同的方法:

  1. 内核实际上纯粹代表其而不是用户进程生成一些进程,并让它们在后台运行(如守护进程)?这些后台进程将处理内务工作,无需用户或用户进程的确认。我将这种方法称为“内核自行运行”

  2. 根本没有内核进程。我们在os中能找到的每一个进程都是用户进程。内核只不过是所有这些用户进程之间共享的一个库(一段代码,以及一些关键数据结构,如页表等)。在每个进程的地址空间中,将加载内核的某些部分,以便当发生任何中断或系统调用时,模式会提升到内核模式。加载到用户进程地址空间的内核代码片段将被执行,以便内核可以处理该事件。当内核这样做时,它仍然处于当前用户进程的上下文中。在这种方法中,仅存在用户进程,但内核将定期在每个用户进程的上下文中运行(但以不同的模式)。

这是一个让我困惑了一段时间的概念性问题。提前致谢!

最佳答案

首先,库可以有自己的后台线程。

其次,答案介于这些方法之间。

大多数类 Unix 系统都构建在 monolithic kernel 之上(或混合型)。这意味着内核将内核线程中的所有后台工作包含在单个地址空间中。我对此写了更多详细信息here .

在大多数 Linux 发行版上,您可以运行

ps -ef | grep '\[.*\]'

它会向您显示内核线程。
但它不会向您显示“内核进程”,因为 ps基本上只显示线程。多线程进程将通过其主线程看到。但内核没有主线程,它拥有所有线程。

如果您想通过地址空间而不是线程的角度来查看进程,那么实际上没有办法做到这一点。但是,如果没有线程可以访问地址空间,则地址空间是无用的,因此您可以通过 /proc/<pid>/mem 访问线程的实际地址空间(如果您有权限)。 。所以如果你使用上面的ps命令并找到一个内核线程,您可以使用此方法查看其地址空间。
但你不必搜索 - 你也可以通过 /proc/kcore 访问内核的地址空间。 .

但是,您会发现这些内核线程在大多数情况下并不是核心内核功能,例如调度和虚拟内存管理。在大多数 Unix 内核中,这些发生在线程进行系统调用期间,该线程在内核模式下运行时进行系统调用。

另一方面,Windows 是基于 microkernel 构建的。 。这意味着内核启动其他进程并将工作委托(delegate)给它们。
在 Windows 上,该微内核的地址空间由 "System" service 表示。 。其他进程 - 文件系统、驱动程序等,以及单片内核所包含的其他部分,例如虚拟内存管理 - 可能在用户模式或内核模式下运行,但仍然在与微内核不同的地址空间中。

您可以获取有关其工作原理的更多详细信息 on Wikipedia .

第三,需要明确的是,这些概念都不能与“系统守护进程”混淆,“系统守护进程”是操作系统运行所需的常规用户空间守护进程,例如 systemd , syslog , cron等等.

这些通常由“init”进程(Unix 系统上的 PID 1)创建,例如systemd,但是 systemd 本身是由内核在启动时创建的。

关于process - 内核是否会产生一些在后台继续运行的进程(而不是用户进程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72923707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com