来自Operating System Concepts的Abraham Silberschatz,Greg Gagne和Peter Baer Galvin讨论了用户线程与内核线程:
可以在用户级别为用户提供对线程的支持 线程或内核,对于内核线程。
用户线程是 在内核之上受支持,并且在没有内核支持的情况下进行管理,
内核线程由以下组件直接支持和管理 操作系统。几乎所有当代运营 系统(包括Windows,Linux,Mac OS X和Solaris)支持 内核线程。
最终,用户线程和内核之间必须存在关系 线程。在本节中,我们介绍了三种常见的建立方法 这样的关系:多对一模型,一对一模型和 多对多模型。
这里是用于创建和管理线程的用户级库与内核级库的讨论:
线程库为程序员提供了用于创建和 管理线程。实现线程有两种主要方法 图书馆。
第一种方法是完全在用户空间中提供没有内核支持的库。库的所有代码和数据结构 存在于用户空间中。这意味着在 库导致在用户空间中调用本地函数,而不是 系统调用。
第二种方法是实现操作系统直接支持的内核级库。在这种情况下,代码和数据 库的结构存在于内核空间中。调用功能 库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是否根据定义创建和管理用户线程或内核线程?
谢谢。
答案 0 :(得分:1)
引用的术语使IMO感到困惑。首先,Linux和Windows(以及我研究过或研究过的大多数其他操作系统)没有用于实现其内部接口和数据结构的“库”。此外,为方便起见,库只是捆绑在一起的代码主体。因此,将库描述为某些基本的和必需的构建块(在内核级别或用户级别)是错误的IMO。
已经说过,实际上,所有系统 do 当然都具有库,可以很方便地协助程序获取操作系统服务和/或相关代码体。一方面,系统调用通常是通过将参数加载到寄存器中并执行某种陷阱指令以将处理器切换到内核模式来实现的。由于几乎所有程序都是用高级语言编写的,因此通常无法直接完成将内容加载到寄存器和执行陷阱指令的工作。因此,很难看到没有任何用户级库的情况下,通常如何“管理”内核线程实现。我的观点是,基本上所有内核线程实现都需要用户级库在某种程度上的帮助。
纯用户级线程实现,另一方面, 可以唯一在库中实现。确实,这将是构成它的逻辑方法。
线程在Linux和Windows的内核级别上实现。本地Windows API具有自己的线程创建和管理功能,这些功能通过Windows系统调用接口来实现。 Linux还通过 its 系统调用接口实现了自己的机制。 posix线程(pthreads)接口被实现为这两个接口之上的库。
通常,pthreads被认为是linux线程的 native 接口,尽管从字面上看并非如此。 pthreads提供的功能包括线程创建,销毁和管理,以及在同步和进程间通信中使用的多种机制。但是,用于实现此功能的基础系统调用包括通常无法直接访问的关键构建块,例如clone
和futex
。用户层使用它们来提供pthreads指定的行为。
Windows具有自己独特的线程管理API,该API内置在“ win32”库中,并使用Windows特定的系统调用来实现其行为。详细信息各不相同(来自linux),并且不符合pthreads规范。但是,您可以在本地库的顶部安装一个 second 库,该库将Windows API调整为与pthreads兼容的接口(该库主要由Windows函数的包装组成)。
因此,对于这两个系统,pthreads库均在各自的OS内核的帮助下(并在两种情况下均使用内核线程实现)创建和管理各种pthread指定的对象。
最后,应该注意Windows也有一个真正的“用户级”线程实现,他们将其命名为“ fiber”。在linux中没有类似的东西(尽管过去其他Unix实现包括用户级线程实现)。据我所知,Windows的pthreads库不提供对光纤实现的访问。