是内核线程进程和守护程序吗?


10

从Mauerer的Linux内核体系结构中,

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

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

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

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

    但是Bovet的《了解Linux内核》指出,内核线程仅在内核模式下运行(请参见下面的引用)。两本书中的“内核线程”的概念是否相同?

    传统的Unix系统将一些关键任务委托给间歇性运行的进程,包括刷新磁盘缓存,换出未使用的页面,为网络连接服务等。实际上,以严格的线性方式执行这些任务并不高效。如果将它们安排在后台,则它们的功能和最终用户流程都将获得更好的响应。由于某些系统进程仅在内核模式下运行,因此现代操作系统将其功能委托给内核线程,而内核线程不会受到不必要的用户模式上下文的阻碍。在Linux中,内核线程在以下方面与常规进程不同:

    • 内核线程仅在内核模式下运行,而常规进程在内核模式和用户模式下交替运行。
    • 由于内核线程仅在内核模式下运行,因此它们仅使用大于PAGE_OFFSET的线性地址。另一方面,常规过程在用户模式或内核模式下都使用全部四个千兆字节的线性地址。
  2. Mauerer的书说内核线程是直接由内核启动的,似乎还说守护程序是内核线程的同义词。因此,我认为守护程序必须直接由内核启动。

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

    首次启动时screen,实际上是在启动用户界面(ui),默认情况下会创建一个守护程序(会话管理器)。

  3. 通常,您如何理解“内核线程”,“进程”和“守护程序”的概念,它们之间的关系和差异?


蒂姆,我最近几天在看着你,所以我正在做一些重要的研究。
rɑːdʒɑ

Answers:


10

首先:信用归功于 /programming/15983872/difference-between-user-level-and-kernel-supported-threads

用户线程和内核线程完全相同。(您可以通过在/ proc /中查看来发现内核线程也在那里。)

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

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

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

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

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.