📜  为什么必须将用户线程映射到内核线程

📅  最后修改于: 2022-05-13 01:56:11.604000             🧑  作者: Mango

为什么必须将用户线程映射到内核线程

先决条件:操作系统中的线程,用户级线程和内核级线程的关系

介绍 :

  • 线程是计算机系统中 CPU 利用率的基本原子单位。
  • 大多数情况下,我们认为进程是 CPU 利用率的基本单位,但进程可能会进一步划分为多个执行线程。一个进程可以划分为不同的任务或单元,可以独立执行,这些单元称为线程(更何况一个进程作为一个整体就是一个线程本身)。
  • 多线程,即由单个进程创建多个线程很重要,因为有时单个线程可能具有短长的 I/O 突发,并且在处理该突发之前,与独立于 I/O 突发的进程相关的其他任务必须暂停,或者有时可能需要并行执行 2 个或更多任务,并且只有一个执行线程无法实现并行性。
  • 例如,文字处理器程序等待用户的输入,但在等待输入或接受输入时,它会执行一些其他任务,如拼写检查、将输出打印到屏幕等。

螺纹类型:
在计算机系统中创建的线程可以是以下两种类型之一:

  1. 用户线程
  2. 内核线程

线程可以在进程本身的地址空间中创建,即在没有内核干预或内核干预的情况下在进程内部创建。

1. 用户线程 –
用户线程是用户在用户库的帮助下创建的线程,并且仅对创建进程及其运行时环境可见(内核不知道这些线程的创建)。用户线程只是停留在创建进程的地址空间中,由创建进程运行和管理,无需内核干预,即,这些线程执行的任何问题都不是内核的头痛问题。



2. 内核线程——
另一方面,内核线程由内核创建并且对内核可见。在提供的库的帮助下,用户进程要求内核为该进程创建一个可执行线程,内核反过来代表进程创建线程,并将其放入它的可用可执行线程列表中。这里线程的创建、执行和管理由内核负责。

现在从线程的定义开始,是时候回答这个问题了,为什么我们需要将这些用户线程映射到内核线程,而它们之间唯一不同的是谁控制这些线程、内核或创建进程的执行?要理解这一点,我们需要看看下面给出的图表。

因此,首先只是为了摆脱困境,图表的最顶层显示了 3 个框,代表内存中的 3 个不同进程,第一个进程在其地址空间中有 3 个用户线程,第二个进程有其中的 2 个,依此类推。上图的第二层显示了内核,每个用户级进程都映射到内核空间中的一个内核线程(为什么?我们会看到它!!)这是用箭头指定的,在底层我们有CPU。

笔记 -
我在这里使用多对一模型来解释映射过程,但还有其他模型可用于映射。有关线程映射模型的更多信息,请参阅本文。

CPU调度器对线程的调度:

  • 现在考虑内部系统结构类似于上图所示。现在发生的是内核中的 CPU 调度程序将线程调度到 CPU 上执行。
  • 但这里的问题是,作为内核一部分的调度程序只知道内核级线程,因为如前所述,内核不知道用户线程的存在,因为它们是在创建进程的地址空间中创建的,因此内核无法控制它们。
  • 内核中的 CPU 调度程序只是查看它拥有的线程“列表”中可供执行的可用线程列表,然后开始调度它们。

用户线程的映射:

  • 但是用户线程会发生什么?再次如前所述,内存中的每个进程本身就是一个“内核线程”,这意味着该进程也在内核的线程列表中。所以这意味着内核将用户进程映射到内核线程之一来执行它。
  • 进程创建的所有用户线程都在指定给整个进程的同一内核级线程上执行。每当轮到指定进程在 CPU 上执行时,它的内核线程就会被调度到 CPU 上,从而执行该进程。
  • 用户线程,由于都是由创建进程自己控制的,所以要一一映射到指定的内核线程上执行。
  • 我们可以把这整个过程看作是创造一个伟大的新产品,可能是一个电子产品或其他东西。如果要出售该产品,则必须以品牌名称出售,并且该品牌或公司需要向政府注册,并且该公司必须遵守政府规定的规则和规定,才能通过商店销售所需的产品在市场上。在这里,我将用户线程称为产品,将内核称为政府,将进程称为公司,将商店称为内核线程。

概括 :
所以简而言之,用户线程需要映射到内核线程,因为是内核调度线程到 CPU 上执行,因此它必须知道它正在调度的线程。对于一个简单的进程,内核只知道进程的存在,而不知道在它内部创建的用户线程,因此内核只会将进程的线程(这是一个内核线程)调度到 CPU 上,所有其他用户线程都在 CPU 上。如果必须执行这些进程,则必须将它们一一映射到指定给创建进程的内核线程上。