在 UNIX 中,当父进程消失时,我认为所有子进程都将 init 重置为其父进程。这不是一直正确吗?有任何例外吗?
来自 Mauerer 的 Linux 内核架构,
内核线程是由内核本身直接启动的进程。它们将内核函数委托给一个单独的进程,并在那里与系统中的其他进程“并行”执行(实际上,与内核本身的执行并行)。内核线程通常被称为(内核)守护进程。例如,它们用于执行以下任务:
- 定期将修改的内存页面与页面来源的块设备同步(例如,使用 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),它默认会创建一个守护进程(会话管理器)。
总的来说,您如何理解“内核线程”、“进程”和“守护进程”的概念,它们的关系和区别?