1

谁能告诉我。所有术语“内核线程”、“本机线程”和“Os 线程”都代表内核线程吗?或者他们是不同的?如果它们不同,那么它们之间的关系是什么?

4

1 回答 1

5

没有真正的标准。术语因上下文而异。但是,我将尝试解释我所知道的不同类型的线程(并添加纤维只是为了完整性,因为我看到人们称它们为线程)。

--内核中的线程

这些很可能是您的内核线程术语所指的内容。它们只存在于内核级别。它们允许(有限的)内核代码本身的并行执行。

--应用线程

这些是术语线程的一般含义。它们是并行执行的单独线程,可以在不同的处理器上调度,共享相同的地址空间并由操作系统作为单个进程处理。

POSIX 标准定义了线程在 POSIX 兼容系统中应该具有的属性(实际上是库以及每个库条目应该如何表现)。Windows 线程模型与 POSIX 模型极为相似,而且,AFAIK 可以安全地按照我所做的一般方式谈论线程:并行执行发生在同一个进程中,并且可以在不同的处理器上调度。

--古代 linux 线程

早期的 linux 内核不支持线程。然而,它确实支持创建两个共享相同地址空间的不同进程。有一个项目(LinuxThreads)试图用它来实现某种线程能力。

当然,问题在于内核仍会将它们视为单独的进程。因此,结果不符合 POSIX。例如,信号的处理是有问题的(因为信号是一个过程级别的概念)。正是在这个非常具体的背景下,“本地人”这个词开始变得普遍。它指的是“本机”,如“内核级别”对线程的支持。

在内核的帮助下,最终实现了对 POSIX 兼容线程的实际支持。今天,这是唯一真正名副其实的线程。事实上,旧的方式根本不是真正的线程。它是由多个进程共享地址空间,因此应该被引用。但曾经有一段时间,这称为线程(因为它是你在 Linux 上唯一能做的事情)。

--用户级和绿色线程

这是另一个上下文,其中“本机”通常用于与另一个线程模型形成对比。绿色线程和用户级线程是确实发生在同一进程中的线程,但它们完全在用户级处理。绿色线程用于虚拟机(尤其是那些实现 pcode 执行的虚拟机,如 java 虚拟机的情况),并且它们也由许多语言在库级别实现(例如:Haskell、Racket、Smalltalk)。

这些线程不需要依赖内核提供的任何线程工具(但通常确实依赖于异步 I/O)。因此,它们通常不能在单独的处理器上进行调度。在这些上下文中,“本机线程”或“OS 线程”可以用来指代实际的内核调度线程,而不是绿色/用户级线程。

请注意,“不能在单独的处理器上调度”仅在它们单独使用时才成立。在同时具有用户级/绿色线程和本机/操作系统线程的混合系统中,可以为每个处理器创建一个本机/操作系统线程(并且在某些系统上设置关联掩码,以便每个仅在特定处理器),然后有效地将用户级线程分配给这些。

--纤维和协同多任务处理

我看到有些人称这些线程。不妥,正确的名字是纤维。它们也是并行执行的模型,但与线程(和进程)相反,它们是协作的。这意味着每当一个纤程运行时,其他纤程将不会运行,直到正在运行的纤程自愿“屈服”执行接受暂停并最终在稍后恢复。

于 2012-09-16T07:19:11.723 回答