multithreading - 内核线程 native 线程os线程

标签 multithreading operating-system

谁能告诉我。所有术语“内核线程”,“ native 线程”和“Os线程”是否都代表内核线程?还是他们不同?如果它们不同,那么所有人之间的关系又是什么?

最佳答案

没有真正的标准。术语取决于上下文。但是,我将尽力解释我所知道的另一种线程(并添加光纤只是为了完整性,因为我已经看到人们称它们为线程)。

-内核中的线程

这些很可能是您的内核线程术语所指的。它们仅存在于内核级别。它们允许(在一定程度上受限制的)并行执行内核代码本身。

-应用程序线程

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

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

-古代linux线程

在早期,Linux内核不支持线程化。但是,它确实支持创建共享相同地址空间的两个不同进程。有一个项目(LinuxThreads)试图使用它来实现某种线程功能。

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

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

-用户级别和绿色线程

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

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

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

-光纤和协作多任务

我见过有人称这些线程。不正确,正确的名称是纤维。它们也是并行执行的模型,但是与线程(和进程)相反,它们是协作的。这意味着无论何时运行光纤,其他光纤都不会运行,直到运行的光纤自愿“屈服”执行并接受挂起并最终在以后恢复。

关于multithreading - 内核线程 native 线程os线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444332/

相关文章:

multithreading - 设置线程在特定内核上工作的优势?

java - 多读取器文件java

linux - 我如何知道 Linux 进程正在等待什么?

c - 如何在C中实现时钟页面替换算法?不是 C++

windows - Win32_PhysicalMemory.Capactiy——它在 32 位应用程序中的表现如何?

c++ - 在每个主机线程(多线程 CPU)上创建一个 cuda 流

.net - SwitchToThread/Thread.Yield 与 Thread.Sleep(0) 与 Thread.Sleep(1)

operating-system - 交叉构建的转速;目标上的 rpm 安装显示 : "intended for a different operating system"

php - 为什么 PHP 中禁用 pcntl_fork() ?

java - 这是代码中的一种死锁吗?