从Mauerer的Linux内核体系结构中,
内核线程是由内核本身直接启动的进程。他们将内核函数委派给一个单独的进程,并在其中与系统中的其他进程“并行”执行(实际上,与内核本身的执行并行)。内核线程通常称为(内核)守护程序。它们用于执行例如以下任务:
- 定期将修改的内存页面与页面所源自的块设备同步(例如,使用mmap映射的文件)。
- 如果很少使用内存页,则将其写入交换区域。
- 管理延迟的操作。
- 为文件系统实现事务日志。
基本上,内核线程有两种类型:
- 类型1-线程启动并等待直到内核请求执行特定操作为止。
- 类型2 —类型一旦启动,线程就会定期运行,检查特定资源的利用率,并在利用率超过或低于设置的限制值时采取措施。内核使用这种类型的线程进行连续监视任务。
由于Mauerer的书说内核线程是进程,所以我认为它们必须在用户模式而不是内核模式下运行。(或者我错了吗?一个进程可以在不同时间以用户模式或内核模式运行,还是只能以一种模式运行?)
但是Bovet的《了解Linux内核》指出,内核线程仅在内核模式下运行(请参见下面的引用)。两本书中的“内核线程”的概念是否相同?
传统的Unix系统将一些关键任务委托给间歇性运行的进程,包括刷新磁盘缓存,换出未使用的页面,为网络连接服务等。实际上,以严格的线性方式执行这些任务并不高效。如果将它们安排在后台,则它们的功能和最终用户流程都将获得更好的响应。由于某些系统进程仅在内核模式下运行,因此现代操作系统将其功能委托给内核线程,而内核线程不会受到不必要的用户模式上下文的阻碍。在Linux中,内核线程在以下方面与常规进程不同:
- 内核线程仅在内核模式下运行,而常规进程在内核模式和用户模式下交替运行。
- 由于内核线程仅在内核模式下运行,因此它们仅使用大于PAGE_OFFSET的线性地址。另一方面,常规过程在用户模式或内核模式下都使用全部四个千兆字节的线性地址。
Mauerer的书说内核线程是直接由内核启动的,似乎还说守护程序是内核线程的同义词。因此,我认为守护程序必须直接由内核启动。
但是https://unix.stackexchange.com/a/193918/674说,
screen
的守护进程是通过screen
用户界面启动的(请参见下面的引用)。我认为screen
用户界面是一个过程,而不是内核。是的概念daemon
在Mauerer的书,并在链接的答复同一个概念?首次启动时
screen
,实际上是在启动用户界面(ui),默认情况下会创建一个守护程序(会话管理器)。通常,您如何理解“内核线程”,“进程”和“守护程序”的概念,它们之间的关系和差异?