请参阅:理解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倍。
内核级线程通常使用几个任务在内核中实现。在这种情况下,内核会在每个进程的时间片内调度每个线程。在这里,由于时钟节拍将确定切换时间,因此任务不太可能将时间片与任务中的其他线程占用时间。内核级线程直接由操作系统支持和管理。用户级线程和内核级线程之间的关系不是完全独立的,实际上这两个级别之间存在相互作用。通常,可以使用以下四个模型之一来实现用户级线程:多对一,一对一,多对多和两级模型。所有这些模型将用户级别的线程映射到内核级别的线程,并在两个级别之间引起不同程度的交互。
线程与进程
- 该程序以程序代码的文本文件开始,
- 该程序被编译或解释为二进制形式,
- 程序被加载到内存中,
- 该程序成为一个或多个正在运行的进程。
- 流程通常彼此独立,
- 而线程作为进程的子集存在。
- 线程之间的通信比进程之间的通信更容易,
- 但是线程更容易受到同一进程中其他线程引起的问题的影响
参考文献:
了解Linux内核,第三版
更多1 2 3 4 5
.............................................................
现在,让我们简化所有这些术语(本段是我的观点)。内核是软件和硬件之间的接口。换句话说,内核的作用就像大脑。它操纵遗传材料(即代码及其派生软件)与身体系统(即硬件或肌肉)之间的关系。
这个大脑(即内核)将信号发送到相应采取行动的进程。这些过程中的一些过程就像肌肉(即线程)一样,每条肌肉都有自己的功能和任务,但它们都可以共同完成工作量。这些线程(即肌肉)之间的通信非常有效且简单,因此它们可以平稳,快速而有效地完成其工作。一些线(即肌肉)在用户的控制下(例如我们手和腿中的肌肉)。其他人则受到大脑的控制(例如我们无法控制的胃,眼,心脏的肌肉)。
用户空间线程可以避免内核,并可以自行管理任务。通常,这被称为“合作多任务”,实际上就像我们的上肢和下肢一样,它在我们自己的控制下,可以共同完成工作(例如练习或...),不需要直接下达命令大脑。另一方面,内核空间线程完全由内核及其调度程序控制。
.............................................................
在回答您的问题时:
是否始终基于一个或多个轻量级过程来实施过程?图3.4似乎是肯定的。为什么图3.5(a)直接在CPU顶部显示进程?
是的,有称为线程的轻量级进程和重量级进程。
一个重量级的进程(您可以称其为信号线程进程)要求处理器本身做更多的工作来命令其执行,这就是为什么图3.5(a)将进程直接显示在CPU之上。
轻量级进程是否总是基于内核线程来实现?图3.4似乎是肯定的。为什么图3.5(b)在过程之上直接显示轻量级过程?
不,轻量级进程分为两类:如上所述,用户级进程和内核级进程。用户级流程依赖于其自己的库来处理其任务。内核本身会调度内核级进程。可以使用以下四个模型之一来实现用户级线程:多对一,一对一,多对多和两级。所有这些模型都将用户级线程映射到内核级线程。
内核线程是唯一能够调度的实体吗?
不,内核级线程是由内核本身创建的。它们与用户级线程的不同之处在于,内核级线程没有有限的地址空间。它们仅生活在内核空间中,从未切换到用户领域。但是,它们是完全可调度且可抢占的实体,就像普通进程一样(请注意:对于重要的内核操作,可以禁用几乎所有中断)。内核自己的线程的目的主要是为了对系统执行维护职责。只有内核可以启动或停止内核线程。另一方面,用户级进程可以基于它自己的库来调度自身,同时可以由内核基于两级和多对多模型(如上所述)进行调度,
轻量级进程是否仅通过调度底层内核线程间接进行调度?
内核线程由内核调度程序本身控制。在用户级别支持线程意味着有一个与应用程序链接的用户级别库,并且该库(不是CPU)在运行时为线程提供了所有管理支持。它将支持实现线程抽象所需的数据结构,并提供所有调度同步以及为这些线程做出资源管理决策所需的其他机制。现在,可以将某些用户级线程进程映射到底层内核级线程,这包括一对一,一对多和多对多映射。
是否仅通过调度底层轻量级进程来间接调度进程?
这取决于它是重量级的还是轻量级的过程。繁重的工作是由内核本身调度的。轻进程可以在内核级别和用户级别进行管理。