内核线程是进程还是守护进程?

Tim*_*Tim 12 linux process linux-kernel daemon

来自 Mauerer 的 Linux 内核架构,

内核线程是由内核本身直接启动的进程。它们将内核函数委托给一个单独的进程,并在那里与系统中的其他进程“并行”执行(实际上,与内核本身的执行并行)。内核线程通常被称为(内核)守护进程。例如,它们用于执行以下任务:

  • 定期将修改的内存页面与页面来源的块设备同步(例如,使用 mmap 映射的文件)。
  • 将很少使用的内存页写入交换区。
  • 管理延迟的操作。
  • 为文件系统实现事务日志。

基本上,有两种类型的内核线程:

  • 类型 1 — 线程启动并等待,直到内核请求执行特定操作。
  • 类型 2 — 一旦启动,线程就会定期运行,检查特定资源的利用率,并在利用率超过或低于设定的限制值时采取行动。内核使用这种类型的线程进行持续监控任务。
  1. 由于 Mauerer 的书说内核线程是进程,我认为它们必须在用户模式下运行,而不是在内核模式下运行。(或者我错了?进程可以在不同时间以用户模式或内核模式运行,还是仅在一种模式下运行?)

    但是 Bovet 的《Understanding Linux Kernel》说内核线程只在内核模式下运行(见下面的引述)。两本书中“内核线程”的概念是同一个概念吗?

    传统的 Unix 系统将一些关键任务委托给间歇运行的进程,包括刷新磁盘缓存、换出未使用的页面、服务网络连接等。事实上,以严格的线性方式执行这些任务是没有效率的。如果在后台调度它们的功能和最终用户进程,它们都会得到更好的响应。因为一些系统进程只在内核模式下运行,现代操作系统将它们的功能委托给内核线程内核线程不会受到不必要的用户模式上下文的影响。在 Linux 中,内核线程在以下方面与常规进程不同:

    • 内核线程仅在内核模式下运行,而常规进程在内核模式和用户模式下交替运行。
    • 因为内核线程只在内核模式下运行,所以它们只使用大于 PAGE_OFFSET 的线性地址。另一方面,常规进程在用户模式或内核模式下使用所有 4 GB 的线性地址。
  2. Mauerer 的书说内核线程是由内核直接启动的,而且似乎还说守护进程是内核线程的同义词。所以我认为守护进程必须由内核直接启动。

    但是https://unix.stackexchange.com/a/193918/674说那个screen守护进程是由screen用户界面启动的(见下面的引用)。我认为screen用户界面是一个进程,而不是内核。是的概念daemon在Mauerer的书,并在链接的答复同一个概念?

    当您第一次启动时screen,您实际上是在启动一个用户界面 (ui),它默认会创建一个守护进程(会话管理器)。

  3. 总的来说,您如何理解“内核线程”、“进程”和“守护进程”的概念,它们的关系和区别?

rɑː*_*dʒɑ 10

第一:信用去 /sf/ask/1118871071/

用户线程和内核线程完全一样。(您可以通过查看 /proc/ 看到内核线程也在那里。)

用户线程是执行用户空间代码的线程。但它可以随时调用内核空间。它仍然被认为是一个“用户”线程,即使它正在以更高的安全级别执行内核代码。

内核线程是只运行内核代码并且不与用户空间进程关联的线程。这些类似于“UNIX 守护进程”,只不过它们是仅内核守护进程。所以你可以说内核是一个多线程程序。例如,有一个用于交换的内核线程。这会强制所有交换问题“序列化”到单个流中。

如果用户线程需要某些东西,它将调用内核,从而将该线程标记为休眠。稍后,交换线程找到数据,因此它将用户线程标记为可运行。稍后,“用户线程”从内核返回到用户态,就好像什么都没发生一样。

事实上,所有线程都是从内核空间开始的,因为 clone() 操作发生在内核空间。(在您可以“返回”到用户空间中的新进程之前,还有很多内核会计要做。)