原文链接:www.geeksforgeeks.org/why-must-us…
原文作者:jamesnit730
基础知识介绍
-
线程:线程是计算机系统中使用 CPU 的最小单位。
-
进程:大多数情况下,我们认为进程是使用 CPU 的基本单位,但一个进程可能进一步分为多个执行线程。一个进程可以分为不同的任务或单元,这些任务或单元可以独立执行,这些单元称为线程。(注:有些进程本身就是一个线程)。
-
多线程:由单个进程创建多个线程是非常重要的事情,因为有时单个线程可能有快速且长时间的I/O突发脉冲,在该突发脉冲被处理之前,与该I/O突发脉冲无关的其他任务必须被暂停;另外一种情况是可能需要并行执行 2 个或更多任务,并且只有一个并行线程执行实现。
-
例如:文字处理器程序等待用户的输入,该程序在等待输入或接受输入时,它会执行一些其他任务,如:拼写检查、将输出打印到屏幕等。
线程类型
在计算机系统中创建的线程可以是两种类型中的任何一种。
- 用户线程
- 内核线程
线程可以在进程本身的地址空间中创建,即在没有内核干预的情况下在进程内部创建,也可以在内核干预下创建。
用户线程
用户线程是由用户在用户库的帮助下创建的线程,只对创建进程和它的运行环境可见(内核不知道这些线程的创建)。用户线程只是停留在创建进程的地址空间中,由创建进程运行和管理,没有内核的干预,也就是说,这些线程的执行出现的任何问题都不是内核的问题。
内核线程
另一方面,内核线程是由内核创建的,对它来说是可见的。一个用户进程在所提供的库的帮助下,要求内核为该进程创建一个可执行的线程,而内核则代表该进程创建该线程,并将其放在现有的可执行线程列表中。在这个过程中,线程的创建、执行和管理是由内核负责的。
现在,从线程的定义开始,是时候回答这个问题了 “为什么我们需要将这些用户线程映射到内核线程?”因为它们之间唯一不同的是谁控制这些线程的执行,内核还是创建进程?为了理解这一点,我们需要看一下下面的图表。
首先,我们要弄清楚这张图的意思。图的最上层显示了3个盒子,代表内存中的3个不同的进程,第一个进程在它的地址空间中有3个用户线程,第二个进程有2个,以此类推。图的第二层显示的是内核,每个用户级进程都被映射到内核空间(为什么?我们等会就知道了)中的一个内核线程,这是用箭头指定的,在底层我们有CPU。
注意
我在这里使用多对一的模型来解释映射过程,但也有其他的模型可用于映射。关于线程的映射模型的更多信息,请参考这篇文章。
通过CPU调度器对线程进行排程
现在假定内部系统的结构就像上图所示的那样。那么此时,内核中的CPU调度器将线程安排到CPU上执行。
但这里的问题是,作为内核的一部分,调度器只知道内核级的线程,因为如前所述,内核不知道用户线程的存在,因为它们是在创建进程的地址空间中创建的,因此内核对它们没有控制权。
内核中的CPU调度程序只是在其拥有的线程 "列表 "中查看可供执行的线程列表,并开始调度它们。
用户线程的映射
但是用户线程会怎么样呢?如前所述,内存中的每个进程都是一个 "内核线程",这意味着该进程也在内核的线程列表中。因此,这意味着内核将用户进程映射到其中一个内核线程中去执行它。
一个进程所创建的所有用户线程都在指定给整个进程的同一个内核级线程上执行。每当轮到指定的进程在CPU上执行时,它的内核线程就会被安排到CPU上,从而执行该进程。
因为所有的线程都是由创建进程本身控制的,用户线程将被逐一映射到指定的内核线程上,从而被执行。
我们可以把这整个过程看作是创造一个伟大的新产品,也许是一个电子小工具或其他东西。如果该产品要出售,它必须以一个品牌名称出售,该品牌或公司需要向政府注册,而且该公司必须遵循政府规定的规则和条例,通过市场上的商店出售所需产品。在这里,用户线程是产品,内核是政府,流程是公司,商店是内核线程。
总结
因此,简而言之,用户线程需要被映射到内核线程,因为是内核将线程安排到CPU上执行,为此它必须知道它所安排的线程。对于一个简单的进程来说,内核只知道这个进程的存在,而不知道在这个进程中创建的用户线程,所以内核只会把这个进程的线程安排到CPU上,所有在这个进程中的其他用户线程如果要被执行,就必须一个一个地映射到指定给创建进程的内核线程。
本文正在参加「金石计划 . 瓜分6万现金大奖」