Vahalia 的 Unix Internal 有一些图显示了进程、内核线程、轻量级进程和用户线程之间的关系。本书最关注SVR4.2,还详细探讨了4.4BSD、Solaris 2.x、Mach 和Digital UNIX。请注意,我不是在问 Linux。
对于每个流程,该流程的底层是否总是存在一个或多个轻量级流程?图 3.4 似乎说是。
为什么图 3.5(a) 显示直接位于 CPU 之上的进程,而中间没有轻量级进程?
对于每个轻量级进程,该轻量级进程底层是否总是只有一个内核线程?图 3.4 似乎说是。
为什么图 3.5(b) 显示轻量级进程直接位于进程之上,中间没有任何内核线程?
内核线程是唯一能够被调度的实体吗?
轻量级进程是否仅通过调度底层内核线程间接调度?
进程是否仅通过调度底层轻量级进程来间接调度?
更新:
我对 Linux 提出了类似的问题Linux 中的轻量级进程是否附加到内核线程? 我猜想可能是因为《Operating System Concepts》这本书隐含地使用 Unix 介绍了概念,而 Unix 和 Linux 可能有所不同,所以我读了有关 Unix 内核的内容。
我很欣赏当前的回复,但我希望重新打开该帖子,以便我可以接受其他回复。
答案1
看:了解 Linux 内核,第三版,作者:Daniel P. Bovet、Marco Cesati
- 发行商: 奥莱利
- 发布日期:2005 年 11 月
- 国际标准书号:0-596-00565-2
- 页数:942
Daniel P. Bovet 和 Marco Cesati 在他们的介绍中说道:
从技术上讲,Linux是一个真正的Unix内核,尽管它不是一个完整的Unix操作系统,因为它不包括所有应用程序,例如文件系统实用程序、窗口系统和图形桌面、系统管理员命令、文本编辑器、编译器等在。因此,您在本书中阅读的内容以及在 Linux 内核中看到的内容也可能有助于您了解其他 Unix 变体。
在接下来的段落中,我将尝试根据我对《理解Linux内核》中所介绍的事实的理解来阐述您的观点,这些事实在很大程度上与Unix中的类似。
流程意味着什么?:
进程就像人类一样,它们被生成,它们具有或多或少重要的生命,它们选择性地生成一个或多个子进程,并最终消亡。一个进程有五个基本部分:代码(“文本”)、数据(VM)、堆栈、文件 I/O 和信号表
内核中进程的目的是充当分配系统资源(CPU 时间、内存等)的实体。当一个进程被创建时,它几乎与其父进程相同。它接收父级地址空间的(逻辑)副本,并从进程创建系统调用之后的下一条指令开始执行与父级相同的代码。尽管父级和子级可能共享包含程序代码(文本)的页面,但它们具有单独的数据副本(堆栈和堆),因此子级对内存位置的更改对父级来说是不可见的(反之亦然) 。
流程如何运作?
执行程序需要的不仅仅是告诉计算机要做什么的二进制代码。该程序需要内存和各种操作系统资源才能运行。 “进程”就是我们所说的程序,它连同它运行所需的所有资源一起加载到内存中。线程是进程内的执行单元。一个进程可以有从一个线程到多个线程的任意位置。当进程启动时,它会被分配内存和资源。进程中的每个线程共享该内存和资源。在单线程进程中,进程包含一个线程。进程和线程是一回事,只发生一件事。在多线程进程中,进程包含多个线程,并且进程同时完成许多事情。
多处理系统的机制包括轻量级和重量级进程:
在重量级进程中,多个进程并行运行。每个并行的重量级进程都有自己的内存地址空间。由于进程具有不同的内存地址,进程间通信很慢。进程之间的上下文切换成本更高。进程不与其他进程共享内存。这些进程之间的通信将涉及额外的通信机制,例如套接字或管道。
在轻量级进程中,也称为线程。线程用于共享和划分工作负载。线程使用它们所属进程的内存。线程间通信比进程间通信更快,因为同一进程的线程与它们所属的进程共享内存。因此,线程之间的通信非常简单且高效。同一进程的线程之间的上下文切换成本较低。线程与同一进程的其他线程共享内存
线程有两种类型:用户级线程和内核级线程。用户级线程避开内核并自行管理工作。用户级线程存在一个问题,即单个线程可以独占时间片,从而使任务中的其他线程挨饿。用户级线程通常在用户空间的内核之上受到支持,并且在没有内核支持的情况下进行管理。内核对用户级线程一无所知,并像管理单线程进程一样管理它们。因此,用户级线程非常快,其运行速度比内核线程快 100 倍。
内核级线程通常使用多个任务在内核中实现。在这种情况下,内核会在每个进程的时间片内调度每个线程。在这里,由于时钟节拍将决定切换时间,因此任务不太可能从任务内的其他线程中占用时间片。内核级线程由操作系统直接支持和管理。用户级线程和内核级线程之间的关系并不是完全独立的,实际上这两个级别之间存在交互作用。一般来说,用户级线程可以使用四种模型之一来实现:多对一、一对一、多对多和两级模型。所有这些模型都将用户级线程映射到内核级线程,并导致两个级别之间不同程度的交互。
线程与进程
- 该程序以编程代码的文本文件开始,
- 该程序被编译或解释为二进制形式,
- 程序被加载到内存中,
- 程序变成一个或多个正在运行的进程。
- 进程通常是相互独立的,
- 而线程作为进程的子集存在。
- 线程之间的通信比进程更容易,
- 但线程更容易受到同一进程中其他线程引起的问题的影响
参考:
................................................
现在,让我们简化所有这些术语(这一段是从我的角度来看的)。内核是软件和硬件之间的接口。换句话说,内核就像大脑一样。它操纵遗传物质(即代码及其衍生软件)和身体系统(即硬件或肌肉)之间的关系。
这个大脑(即内核)向进程发送信号,进程相应地采取行动。其中一些过程就像肌肉(即线程),每块肌肉都有自己的功能和任务,但它们都一起工作来完成工作量。这些线程(即肌肉)之间的通信非常高效且简单,因此它们顺利、快速、有效地完成了自己的工作。一些线程(即肌肉)处于用户的控制之下(例如我们手和腿的肌肉)。其他的则受大脑控制(例如我们无法控制的胃、眼睛、心脏中的肌肉)。
用户空间线程避开内核并自行管理任务。通常这被称为“协作多任务处理”,实际上它就像我们的上肢和下肢,它在我们自己的控制之下,并且它一起工作以完成工作(即练习或......)并且不需要直接命令大脑。另一方面,内核空间线程完全由内核及其调度程序控制。
................................................
在回答您的问题时:
流程是否始终基于一个或多个轻量级流程来实施?图3.4似乎说是的。为什么图 3.5(a) 显示直接位于 CPU 之上的进程?
是的,有称为线程的轻量级进程和重量级进程。
重量级进程(您可以将其称为信号线程进程)需要处理器本身做更多的工作来命令其执行,这就是为什么图 3.5(a) 显示了直接位于 CPU 之上的进程。
轻量级进程总是基于内核线程实现吗?图 3.4 似乎说是。为什么图 3.5(b) 直接在进程之上显示轻量级进程?
不,轻量级进程分为两类:用户级进程和内核级进程,如上所述。用户级进程依赖其自己的库来处理其任务。内核本身调度内核级进程。用户级线程可以使用四种模型之一来实现:多对一、一对一、多对多和两级。所有这些模型将用户级线程映射到内核级线程。
内核线程是唯一能够被调度的实体吗?
不,内核级线程是由内核本身创建的。它们与用户级线程的不同之处在于,内核级线程没有有限的地址空间。它们仅存在于内核空间中,从不切换到用户空间领域。然而,它们是完全可调度和可抢占的实体,就像普通进程一样(注意:可以禁用几乎所有重要内核操作的中断)。内核自己的线程的目的主要是对系统执行维护职责。只有内核可以启动或停止内核线程。另一方面,用户级进程可以基于它自己的库来调度自己,同时它可以由内核基于两级和多对多模型(上面提到的)进行调度,这允许将某些用户级线程绑定到单个内核级线程。
轻量级进程是否仅通过调度底层内核线程间接调度?
内核线程由内核调度程序本身控制。在用户级支持线程意味着有一个与应用程序链接的用户级库,并且该库(而不是 CPU)为线程提供运行时支持中的所有管理。它将支持实现线程抽象所需的数据结构,并提供为这些线程做出资源管理决策所需的所有调度同步和其他机制。现在,一些用户级线程进程可以映射到底层内核级线程,这包括一对一、一对多和多对多映射。
进程是否仅通过调度底层轻量级进程来间接调度?
这取决于它是重量级进程还是轻量级进程。重进程是由内核本身调度的进程。轻进程可以在内核级和用户级进行管理。