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


12

Vahalia的Unix Internal拥有显示进程,内核线程,轻量级进程和用户线程之间关系的数字。本书最关注SVR4.2,还详细探讨了4.4BSD,Solaris 2.x,Mach和Digital UNIX。请注意,我并不是在问Linux。

  1. 对于每个流程,该流程始终存在一个或多个轻量级流程吗?图3.4似乎是肯定的。

    为什么图3.5(a)在CPU上直接显示进程,而在两者之间却没有轻量级进程?

  2. 对于每个轻量级进程,轻量级进程始终始终存在一个内核线程吗?图3.4似乎是肯定的。

    为什么图3.5(b)在进程顶部直接显示轻量级进程,而在它们之间却没有任何内核线程?

  3. 内核线程是唯一能够调度的实体吗?

  4. 轻量级进程是否仅通过调度底层内核线程间接进行调度?

  5. 是否仅通过调度底层轻量级进程来间接调度进程?

图3-4。 轻量级工艺

图3-5。 用户线程实现


更新:

我问了一个类似的Linux问题,Linux 的内核线程是否有轻量级进程? 我猜可能是因为《操作系统概念》一书隐含地介绍了使用Unix的概念,而Unix和Linux可能有所不同,所以我了解了Unix内核。

感谢当前的回复,但我希望重新打开该帖子,以便我可以接受其他回复。


为什么将这样的问题标记为过于局限。实际上,这是关于Linux概念的一个好问题。文件通常不够详细,解释会是一个很好的答案
炸鱼薯条德里克

重新主持人:不是纯粹的问题数量,而是问题的性质。我问的是几个密切相关和令人困惑的概念之间的关系。我想人们如果不了解它,可能会认为问题的数量很重要。
蒂姆(Tim)

Answers:


12

请参阅:理解Linux内核,第三版,Daniel P. Bovet,Marco Cesati

  • 发行人:O'Reilly
  • 发布日期:2005年11月
  • 国际标准书号(ISBN):0-596-00565-2
  • 网页:942

Daniel P. Bovet和Marco Cesati在介绍中说:

从技术上讲,Linux虽然不是完整的Unix操作系统,但却是真正的Unix内核,因为它不包括所有应用程序,例如文件系统实用程序,窗口系统和图形桌面,系统管理员命令,文本编辑器,编译器等。上。因此,您在本书中阅读并在Linux内核中看到的内容也可以帮助您理解其他Unix变体。

在接下来的几段中,我将基于对“了解Linux内核”中介绍的事实的理解,尝试解决您的观点,该事实在很大程度上与Unix中的相似。

一个过程意味着什么?

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

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

流程如何运作?

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

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

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

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

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

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

在此处输入图片说明

线程与进程

  1. 该程序以程序代码的文本文件开始,
  2. 该程序被编译或解释为二进制形式,
  3. 程序被加载到内存中,
  4. 该程序成为一个或多个正在运行的进程。
  5. 流程通常彼此独立,
  6. 而线程作为进程的子集存在。
  7. 线程之间的通信比进程之间的通信更容易,
  8. 但是线程更容易受到同一进程中其他线程引起的问题的影响

参考文献:

了解Linux内核,第三版

更多1 2 3 4 5

.............................................................

现在,让我们简化所有这些术语(本段是我的观点)。内核是软件和硬件之间的接口。换句话说,内核的作用就像大脑。它操纵遗传材料(即代码及其派生软件)与身体系统(即硬件或肌肉)之间的关系。

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

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

.............................................................

在回答您的问题时:

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

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

    一个重量级的进程(您可以称其为信号线程进程)要求处理器本身做更多的工作来命令其执行,这就是为什么图3.5(a)将进程直接显示在CPU之上。

  2. 轻量级进程是否总是基于内核线程来实现?图3.4似乎是肯定的。为什么图3.5(b)在过程之上直接显示轻量级过程?

    不,轻量级进程分为两类:如上所述,用户级进程和内核级进程。用户级流程依赖于其自己的库来处理其任务。内核本身会调度内核级进程。可以使用以下四个模型之一来实现用户级线程:多对一,一对一,多对多和两级。所有这些模型都将用户级线程映射到内核级线程。

  3. 内核线程是唯一能够调度的实体吗?

    不,内核级线程是由内核本身创建的。它们与用户级线程的不同之处在于,内核级线程没有有限的地址空间。它们仅生活在内核空间中,从未切换到用户领域。但是,它们是完全可调度且可抢占的实体,就像普通进程一样(请注意:对于重要的内核操作,可以禁用几乎所有中断)。内核自己的线程的目的主要是为了对系统执行维护职责。只有内核可以启动或停止内核线程。另一方面,用户级进程可以基于它自己的库来调度自身,同时可以由内核基于两级和多对多模型(如上所述)进行调度,

  4. 轻量级进程是否仅通过调度底层内核线程间接进行调度?

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

  5. 是否仅通过调度底层轻量级进程来间接调度进程?

    这取决于它是重量级的还是轻量级的过程。繁重的工作是由内核本身调度的。轻进程可以在内核级别和用户级别进行管理。


谢谢。(1)unix.stackexchange.com/questions/472354/… (2)我特别询问了有关Unix而不是LInux的问题,尽管我感谢您的答复,这对Linux尤其有用,希望您可以保留它。
蒂姆(Tim)

1
“内核自己的线程的目的主要是为了对系统执行维护职责”-您能否详细说明或提供参考,Goro
iruvar,

@iruva我相信“维护职责”不是一个准确的术语,例如,电源管理由内核线程控制,与维护职责无关。实际上,与此文章一起提供的参考都包含有关内核线程的丰富信息。如果您希望我详细说明,请发布有关内核线程及其功能/类型/如何创建的新问题...等等,我很乐意解释。这个答案足够长,无法接受其他信息!

@Tim:您问的是哪个版本的Unix?特别是您在书中讨论的您提到的古老系统?是否包括现代BSD?是否包括Solaris 11?是否包括MacOS X Leopard(认证的UNIX)?
user1686 '18

@grawity我询问过这本书,所以无论这本书使用什么。如果您知道其他版本,那也很好。
蒂姆(Tim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.