Unix中的进程,内核线程,轻量级进程和用户线程之间有什么关系?

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)直接在进程之上显示轻量级进程,而中间没有任何内核线程?
>内核线程是唯一能够安排的实体吗?
>轻量级进程是否仅通过调度间接调度
底层内核线程?
>是否仅通过安排进程间接安排进程
底层轻量级流程?

Figure 3-4. Lightweight processes

Figure 3-5. User thread implementations

更新:

我问过Linux Is a light weight process attached to a kernel thread in Linux?的类似问题
我猜这可能是因为“操作系统概念”一书使用Unix隐式引入了概念,而Unix和Linux可能会有所不同,所以我读到了关于Unix内核的内容.

我很欣赏当前的回复,但我希望重新开启这个帖子,以便接受其他回复.

最佳答案
请参阅:Daniel P. Bovet,Marco Cesati了解Linux内核,第3版

>出版商:O’Reilly
>发布日期:2005年11月
> ISBN:0-596-00565-2
>页数:942

在他们的介绍中,Daniel P. Bovet和Marco Cesati说:

Technically speaking, Linux is a true Unix kernel, although it is not a full Unix operating system, because it does not include all the
applications such as filesystem utilities, windowing systems and
graphical desktops, system administrator commands, text editors,
compilers, and so on. What you read in this book and see in the Linux
kernel, therefore, may help you understand the other Unix variants
too.

在接下来的段落中,我将根据我对“理解Linux内核”中提供的事实的理解来解决您的观点,这在很大程度上与Unix中的相似.

过程意味着什么?:

流程就像人类一样,生成它们,它们或多或少具有重要的生命,它们可选地生成一个或多个子流程,最终它们会死亡.进程有五个基本部分:代码(“文本”),数据(VM),堆栈,文件I / O和信号表

内核中进程的目的是充当分配系统资源(CPU时间,内存等)的实体.创建进程时,它几乎与其父进程相同.它接收父地址空间的(逻辑)副本,并执行与父进程相同的代码,从进程创建系统调用之后的下一条指令开始.尽管父级和子级可以共享包含程序代码(文本)的页面,但它们具有单独的数据副本(堆栈和堆),因此子级对内存位置的更改对于父级是不可见的(反之亦然) .

流程如何运作?

执行程序需要的不仅仅是告诉计算机要做什么的二进制代码.程序需要内存和各种操作系统资源才能运行. “进程”就是我们所说的已加载到内存中的程序以及它需要运行的所有资源.线程是进程内的执行单元.进程可以包含从一个线程到多个线程的任何位置.进程启动时,会为其分配内存和资源.进程中的每个线程共享该内存和资源.在单线程进程中,该进程包含一个线程.进程和线程是同一个,只有一件事发生.在多线程进程中,进程包含多个线程,并且该进程同时完成了许多事情.

多处理系统的机制,包括轻量级和重量级的流程:

在重量级进程中,多个进程并行运行.并行的每个重量级进程都有自己的内存地址空间.由于进程具有不同的内存地址,进程间通信很慢.进程之间的上下文切换更加昂贵.进程不与其他进程共享内存.这些过程之间的通信将涉及额外的通信机制,例如套接字或管道.

在轻量级进程中,也称为线程.线程用于共享和划分工作负载.线程使用它们所属进程的内存.线程间通信可以比进程间通信更快,因为同一进程的线程与它们所属的进程共享内存.结果,线程之间的通信非常简单和有效.同一进程的线程之间的上下文切换较便宜.线程与同一进程的其他线程共享内存

有两种类型的线程:用户级线程和内核级线程.用户级线程避免内核并自行管理工作.用户级线程存在一个问题,即单个线程可以独占时间片,从而使任务中的其他线程匮乏.用户级线程通常在用户空间内核支持之上,并且在没有内核支持的情况下进行管理.内核对用户级线程一无所知,并将它们作为单线程进程进行管理.因此,用户级线程非常快,运行速度比内核线程快100倍.

内核级线程通常使用多个任务在内核中实现.在这种情况下,内核会在每个进程的时间片内调度每个线程.这里,由于时钟标记将确定切换时间,因此任务不太可能从任务内的其他线程占用时间片.内核级线程由操作系统直接支持和管理.
用户级线程与内核级线程之间的关系并不完全独立,实际上这两个级别之间存在交互.
通常,可以使用以下四种模型之一来实现用户级线程:
多对一,一对一,多对多和两级模型.所有这些模型都将用户级线程映射到内核级线程,并在两个级别之间产生不同程度的交互.

enter image description here

线程与进程

>该程序以编程代码的文本文件开头,
>程序被编译或解释为二进制形式,
>程序被加载到内存中,
>该程序成为一个或多个正在运行的进程.
>流程通常彼此独立,
>虽然线程作为进程的子集存在.
>线程可以比进程更容易地相互通信,
>但是线程更容易受到同一进程中其他线程引起的问题的影响

参考文献:

Understanding the Linux Kernel, 3rd Edition

更多1 2 3 4 5

………………………………………..

现在,让我们简化所有这些术语(本段来自我的观点).
内核是软件和硬件之间的接口.换句话说,内核就像一个大脑.它操纵遗传物质(即代码及其衍生物软件)和身体系统(即硬件或肌肉)之间的关系.

这个大脑(即内核)向相应动作的进程发送信号.这些过程中的一些就像肌肉(即线程),每个肌肉都有自己的功能和任务,但它们共同完成工作量.这些线程(即肌肉)之间的通信非常有效和简单,因此它们可以平稳,快速和有效地完成工作.一些线(即肌肉)受用户控制(如我们手和腿的肌肉).其他人受大脑控制(就像我们胃,眼睛,心脏的肌肉,我们无法控制).

用户空间线程避免了内核并自行管理任务.这通常被称为“合作多任务处理”,实际上它就像我们的上肢和下肢,它在我们自己的控制之下,它可以共同完成工作(即练习或……),并且不需要来自大脑.另一方面,内核空间线程完全由内核及其调度程序控制.

………………………………………..

在回答您的问题时:

>流程是否始终基于一个或多个轻量级流程实施?图3.4似乎是肯定的.为什么图3.5(a)直接在CPU上显示进程?

是的,有轻量级进程称为线程和重量级进程.

一个重量级的进程(你可以称之为信号线程进程)需要处理器本身做更多的工作来命令它的执行,这就是图3.5(a)直接在CPU之上显示进程的原因.
>是否总是基于内核线程实现轻量级进程?图3.4似乎是肯定的.为什么图3.5(b)直接在流程上显示轻量级流程?

不,轻量级进程分为两类:用户级和内核级进程,如上所述.用户级进程依赖于自己的库来处理其任务.内核本身安排内核级进程.用户级线程可以使用以下四种模型中的一种来实现:
多对一,一对一,多对多和两级.所有这些模型都将用户级线程映射到内核级线程.
>内核线程是唯一能够安排的实体吗?

不,内核级线程由内核本身创建.它们与用户级线程不同,因为内核级线程没有有限的地址空间.他们只生活在核心空间,从不切换到用户领域.但是,它们是完全可调度和可抢占的实体,就像正常进程一样(注意:可以为重要的内核操作禁用几乎所有中断).内核自己的线程的目的主要是在系统上执行维护任务.只有内核可以启动或停止内核线程.另一方面,用户级进程可以基于它自己的库来安排自己,同时它可以由内核根据两级和多对多模型(如上所述)进行调度,这允许将某些用户级线程绑定到单个内核级线程.
>轻量级进程是否仅通过调度底层内核线程间接调度?

内核线程由内核调度程序本身控制.在用户级支持线程意味着存在与应用程序链接的用户级库,并且该库(而不是CPU)提供线程的运行时支持中的所有管理.它将支持实现线程抽象所需的数据结构,并提供所有调度同步以及为这些线程做出资源管理决策所需的其他机制.现在,一些用户级线程进程可以映射到底层内核级线程,这包括一对一,一对多和多对多映射.
>是否仅通过调度基础轻量级进程间接调度进程?

这取决于它是重量级还是轻量级的过程.重是由内核本身安排的进程.轻量级进程可以在内核级别和用户级别进行管理.

转载注明原文:Unix中的进程,内核线程,轻量级进程和用户线程之间有什么关系? - 代码日志