从 Mauerer 的 Linux 内核架构来看,
内核线程是由内核本身直接启动的进程。它们将内核函数委托给一个单独的进程,并与系统中的其他进程“并行”执行(实际上,与内核本身的执行并行)。内核线程通常被称为(kernel)守护进程。例如,它们用于执行以下任务:
- 定期将修改的内存页面与页面所在的块设备同步(例如,使用 mmap 映射的文件)。
- 如果很少使用内存页,则将其写入交换区。
- 管理延期行动。
- 实现文件系统的事务日志。
基本上,有两种类型的内核线程:
- 类型 1 — 线程启动并等待,直到内核请求执行特定操作。
- 类型 2 — 一旦启动,线程就会定期运行,检查特定资源的利用率,并在利用率超过或低于设定的限制值时采取操作。内核使用这种类型的线程来执行连续的监视任务。
由于Mauerer的书说内核线程是进程,所以我认为它们必须运行在用户模式,而不是内核模式。 (或者我错了?进程可以在不同时间运行在用户模式或内核模式下,还是只能运行在一种模式下?)
但 Bovet 的 Understanding Linux Kernel 表示内核线程仅在内核模式下运行(请参阅下面的引用)。两本书中的“内核线程”的概念是同一个概念吗?
传统的 Unix 系统将一些关键任务委托给间歇性运行的进程,包括刷新磁盘缓存、交换未使用的页面、维护网络连接等。事实上,以严格的线性方式执行这些任务效率不高。如果将它们安排在后台,它们的功能和最终用户进程都会得到更好的响应。由于某些系统进程仅在内核模式下运行,因此现代操作系统将其功能委托给内核线程,它们不会受到不必要的用户模式上下文的阻碍。在 Linux 中,内核线程与常规进程有以下不同之处:
- 内核线程仅在内核模式下运行,而常规进程则在内核模式和用户模式下交替运行。
- 由于内核线程仅在内核模式下运行,因此它们仅使用大于 PAGE_OFFSET 的线性地址。另一方面,常规进程在用户模式或内核模式下使用全部 4 GB 线性地址。
Mauerer的书说内核线程是由内核直接启动的,似乎也说守护进程是内核线程的同义词。所以我认为守护进程必须由内核直接启动。
但https://unix.stackexchange.com/a/193918/674说它
screen
的守护进程是由screen
用户界面启动的(参见下面的引用)。我认为screen
用户界面是一个进程,而不是内核。daemon
Mauerer 书中的概念和链接回复中的概念是同一概念吗?当您第一次启动时
screen
,您实际上正在启动一个用户界面(ui),默认情况下它将创建一个守护程序(会话管理器)。总的来说,你如何理解“内核线程”、“进程”和“守护进程”的概念、它们的关系和区别?
答案1
用户线程和内核线程完全相同。 (您可以通过查看 /proc/ 看到内核线程也在那里。)
用户线程是执行用户空间代码的线程。但它可以随时调用内核空间。尽管它以更高的安全级别执行内核代码,但它仍然被视为“用户”线程。
内核线程是一种仅运行内核代码且不与用户空间进程关联的线程。它们类似于“UNIX 守护进程”,只不过它们是仅内核守护进程。所以你可以说内核是一个多线程程序。例如,有一个内核线程用于交换。这迫使所有交换问题“序列化”到单个流中。
如果用户线程需要某些东西,它会调用内核,内核会将该线程标记为休眠。稍后,交换线程会找到数据,因此它会将用户线程标记为可运行。稍后,“用户线程”会从内核返回用户空间,就像什么都没发生一样。
事实上,所有线程都是在内核空间中启动的,因为clone()操作发生在内核空间中。 (在您可以“返回”用户空间中的新进程之前,需要执行大量内核统计操作。)