内核和用户线程之间的关系

时间:2009-07-24 16:39:05

标签: operating-system kernel

内核和用户线程之间是否存在关系?

一些操作系统教科书称“映射一个(多个)用户线程到一个(多个)内核线程”。 地图在这里意味着什么?

5 个答案:

答案 0 :(得分:40)

当他们说map时,他们意味着每个内核线程被分配给一定数量的用户模式线程。

内核线程用于为应用程序(例如系统调用)提供特权服务。内核还使用它们来跟踪系统上运行的所有内容,分配给哪个进程的资源,以及安排它们。

如果您的应用程序大量使用系统调用,则每个内核线程会有更多用户线程,并且您的应用程序运行速度会变慢。这是因为内核线程将成为瓶颈,因为所有系统调用都将通过它。

另一方面,如果您的程序很少使用系统调用(或其他内核服务),您可以将大量用户线程分配给内核线程,而不会产生额外的性能损失。

您可以增加内核线程的数量,但这通常会增加内核的开销,因此虽然各个线程对系统调用的响应速度会更快,但整个系统会变慢。

这就是为什么在内核线程数和每个内核线程的用户线程数之间找到一个很好的平衡是很重要的。

答案 1 :(得分:18)

答案 2 :(得分:16)

用户线程在用户空间中管理 - 这意味着调度,切换等不是来自内核。

最终,OS内核负责“执行单元”之间的上下文切换 - 您的用户线程必须与内核可调度对象相关联(即“映射”) - 内核线程 1

因此,给定N个用户线程 - 您可以使用N个内核线程(1:1映射)。这允许您利用内核的硬件多处理(在多个CPU上运行)并且是一个非常简单的库 - 基本上只是将大部分工作推迟到内核。但是,它可以使您的应用程序在OS之间移植,因为您不直接调用内核线程函数。我相信POSIX线程(PThreads)是首选的* nix实现,并且它遵循1:1映射(使其几乎等同于内核线程)。但是,这并不能保证,因为它依赖于实现(使用PThreads的主要原因是内核之间的可移植性)。

或者,您只能使用1个内核线程。这允许您在非多任务操作系统上运行,或者完全负责调度。 Windows“User Mode Scheduling是此N:1地图的示例。

或者,您可以映射到任意数量的内核线程 - N:M映射。 Windows有Fibers,这允许您将N个光纤映射到M个内核线程并协同安排它们。线程池也可以是这样的一个例子 - M个线程的N个工作项。

1 :进程至少有一个内核线程,它是实际的执行单元。此外,内核线程必须包含在进程中。操作系统必须安排线程运行 - 而不是进程。

答案 3 :(得分:0)

  • 这是关于线程库实现的问题。
  • 在Linux中,线程(或任务)可以位于用户空间或内核空间中。当进程要求内核通过syscall(read,write或ioctl)执行某些操作时,进程进入内核空间。
  • 还有一个所谓的内核线程,它始终在内核空间中运行,并不代表任何用户进程。

答案 4 :(得分:0)

根据WikipediaOracle,用户级线程实际上位于内核线程上的层中; 内核线程与用户级线程一起执行,但一般来说,处理器/操作系统实际执行的唯一实体内核线程。

例如,假设我们有一个带有2个用户级线程的程序,它们都映射到(即分配)相同的内核线程。有时,内核线程运行第一个用户级线程(并且据说当前此内核线程映射到第一个用户级线程),有时其他内核线程运行第二个用户级线程。所以我们说我们有两个用户级线程映射到同一个内核线程。

作为澄清

操作系统的核心称为 kernel ,因此内核级别的线程(即内核知道和管理的线程)称为内核线程,调用服务的OS核心可以称为内核调用,以及...... 内核 事物之间唯一明确的关系是它们与OS核心密切相关,仅此而已。