用户线程和内核线程是否可以通过以下任何方式与线程级库和内核级库相对应?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户线程和内核线程是否可以通过以下任何方式与线程级库和内核级库相对应?相关的知识,希望对你有一定的参考价值。

来自亚历山大·西尔贝沙茨,格雷格·加涅和彼得·贝尔·高尔文的Operating System Concepts,这里是用户线程与内核线程的讨论:

可以在用户级别为用户线程提供对线程的支持,或者由内核提供对内核线程的支持。

  • 内核上方支持用户线程,无需内核支持即可管理用户线程,
  • 内核线程由操作系统直接支持和管理。几乎所有现代操作系统 - 包括Windows,Linux,Mac OS X和Solaris-都支持内核线程。

最终,用户线程和内核线程之间必须存在关系。在本节中,我们将介绍建立这种关系的三种常用方法:多对一模型,一对一模型和多对多模型。

这里讨论用户级库与内核级库,用于创建和管理线程:

线程库为程序员提供了用于创建和管理线程的API。实现线程库有两种主要方法。

  • 第一种方法是完全在用户空间中提供一个没有内核支持的库。库的所有代码和数据结构都存在于用户空间中。这意味着调用库中的函数会导致用户空间中的本地函数调用而不是系统调用。
  • 第二种方法是实现操作系统直接支持的内核级库。在这种情况下,库的代码和数据结构存在于内核空间中。在库中为API调用函数通常会导致对内核的系统调用。

目前正在使用三个主要的线程库:POSIX Pthreads,Windows和Java。 Pthreads是POSIX标准的线程扩展,可以作为用户级或内核级库提供。 Windows线程库是Windows系统上可用的内核级库。 Java线程API允许直接在Java程序中创建和管理线程。但是,因为在大多数情况下JVM在主机操作系统之上运行,所以Java线程API通常使用主机系统上可用的线程库来实现。这意味着在Windows系统上,Java线程通常使用Windows API实现; UNIX和Linux系统通常使用Pthreads。

用户线程和内核线程是否可以通过以下任何方式与线程级库和内核级库相对应?

  • 用户级库是否必须仅创建和管理用户线程但没有内核线程?
  • 内核级库是否必须仅创建和管理内核线程但不管理用户线程?
  • 用户级别库是否必须由用户级库创建和管理,而不是由内核级库创建和管理?
  • 内核线程是否必须由内核级库而不是用户级库创建和管理?

该书说“Pthreads,POSIX标准的线程扩展,可以作为用户级或内核级库提供。”

  • PThread是Linux中的内核级库和Windows中的用户级库吗?
  • PThread是否根据定义创建和管理用户线程或内核线程?

谢谢。

答案

用户级库是否必须仅创建和管理用户线程但没有内核线程?

看来,这里的短语“用户级库”指的是不依赖于允许创建和管理线程的内核系统调用的库,因此根据定义它不能创建内核线程。

这里的想法是内核仍然没有意识到你正在进程中进行线程化。这种方法的主要限制是此类进程当时不能使用多个处理器核心。

内核级库是否必须仅创建和管理内核线程但不管理用户线程?

“内核级库”有点用词不当。库是用户空间概念。在某些情况下,库函数和内核系统调用之间可能存在一对一的对应关系,但它通常不是最实用的解决方案。

在Linux中,有一个clone系统调用可以创建一个新进程。此新进程可以与父级共享内存,文件描述符和其他资源。在高级别,我们经常将这样的进程称为一个进程中的线程。直接使用系统调用通常是不必要的复杂性并且使得可移植性变得困难,因此通常使用用户空间库。

在某种意义上,常见的pthread实现是'内核级',pthread线程对应于系统线程1-1,但在许多情况下,库函数调用不需要对应系统调用1-1。特别是,最常用的功能是专门设计的,因此在大多数情况下它们不需要使用系统调用。它有助于提高性能

可以通过其他方式实现pthread,但这似乎是最实用的。它将大多数选项留在库用户手中,因为内部或外部的线程之间没有额外的间接级别。

用户级别库是否必须由用户级库创建和管理,而不是由内核级库创建和管理?

“用户线程”只是内核无法识别的类似流程的构造。 “内核级”库可能会使用类似的东西。也可以直接实现它们而无需使用任何库。

内核线程是否必须由内核级库而不是用户级库创建和管理?

内核线程的创建依赖于创建线程的系统调用。在大多数情况下,它将在库中使用,但原则上您可以直接调用它们。

另一答案

引用的命名法让IMO感到困惑。首先,Linux和Windows(以及我查看过的大多数其他操作系统)都没有“库”来实现其内部接口和数据结构。此外,为方便起见,库只是捆绑在一起的代码体。因此,将库描述为一些基本和必要的构建块(在内核或用户级别)是错误的IMO。

话虽如此,实际上,所有系统当然都有库,以方便程序获取操作系统服务和/或相关的代码体。首先,系统调用通常通过将参数加载到寄存器中并执行某种陷阱指令来将处理器切换到内核模式来实现。由于几乎所有程序都是用高级语言编写的,因此通常不能直接在寄存器中加载和执行陷阱指令。因此,很难看出内核线程实现(通常情况下)如何在没有任何用户级库的情况下进行“管理”。我的观点是,基本上所有内核线程实现都需要来自用户级库的协助。

另一方面,纯粹的用户级线程实现可以仅在库中实现。实际上,这将是构建它的合理方式。

线程在Linux和Windows的内核级别实现。本机Windows API具有通过Windows系统调用接口访问的自己的线程创建和管理工具。 Linux也有自己的机制通过其系统调用接口实现。 posix线程(pthreads)接口在两者之上实现为库。

通常,pthreads被认为是linux线程的本机接口,尽管这并不是真的。 pthreads提供的工具包括线程创建,销毁和管理以及同步和进程间通信中使用的许多机制。但是,用于实现此目的的基础系统调用包括通常不直接访问的关键构建块,如clonefutex。用户级层使用它们来提供pthreads指定的行为。

Windows有自己独特的线程管理API,内置于“win32”库中,并使用特定于Windows的系统调用来实现其行为。细节都不同(来自linux)并且它不符合pthreads规范。但是,您可以在本机上安装第二个库,使Windows API适应与pthreads兼容的接口(它主要包含围绕Windows功能的包装器)。

因此,对于两个系统,pthreads库在相应的OS内核的帮助下创建和管理各种pthread指定的对象(并且在两种情况下都使用内核线程实现)。

最后,应该注意的是,Windows还有一个真正的“用户级”线程实现,它们被称为“光纤”。在Linux中没有模拟(尽管过去的其他Unix实现包括用户级线程实现)。据我所知,Windows的pthreads库不提供对光纤实现的访问。

以上是关于用户线程和内核线程是否可以通过以下任何方式与线程级库和内核级库相对应?的主要内容,如果未能解决你的问题,请参考以下文章

线程的3种实现方式--内核级线程, 用户级线程和混合型线程

是否有一个单独的内核级线程来处理用户进程的系统调用?

进程管理-第一节6:线程的实现方式和多线程模型

内核支持线程 & 用户级线程

用户级线程和内核级线程的区别

内核级线程(KLT)和用户级线程(ULT)