Multithreading 用户级线程编程-多个内核线程? P>许多编程语言,如C++(POSIX库)和java提供了与用户级线程一起使用的能力。但是,如果所有这些用户级线程都在单个内核线程中运行,那么您只能得到多道程序设计或多处理(如果多个处理器可用)的错觉,对吗?我的意思是,所有这些线程仍然在同一个内核线程中运行。我这样说对吗?如果是的话,那么我们计划如何使用用户级线程来提高性能呢

Multithreading 用户级线程编程-多个内核线程? P>许多编程语言,如C++(POSIX库)和java提供了与用户级线程一起使用的能力。但是,如果所有这些用户级线程都在单个内核线程中运行,那么您只能得到多道程序设计或多处理(如果多个处理器可用)的错觉,对吗?我的意思是,所有这些线程仍然在同一个内核线程中运行。我这样说对吗?如果是的话,那么我们计划如何使用用户级线程来提高性能呢,multithreading,operating-system,Multithreading,Operating System,编辑:我想在多对一模型(用户级线程到内核线程的映射)上性能是不可能的。因此,在多对多模型中,只有在内核级线程分叉的情况下,性能改进才有可能。所以我的问题是,即使用户级线程的开销很低,我也无法想象性能的改善会像调度内核级线程那样好 EDIT2:本质上这就是我想要验证的——“假设一台计算机有4个处理器。现在,假设我的程序是唯一运行的东西——并且有4个线程,每个线程都做完全独立的事情。现在,如果映射是一对一(用户到内核映射),我实际上可以得到完美的4倍加速。但是如果(出于某种原因)所有4个用户线程都映

编辑:我想在多对一模型(用户级线程到内核线程的映射)上性能是不可能的。因此,在多对多模型中,只有在内核级线程分叉的情况下,性能改进才有可能。所以我的问题是,即使用户级线程的开销很低,我也无法想象性能的改善会像调度内核级线程那样好


EDIT2:本质上这就是我想要验证的——“假设一台计算机有4个处理器。现在,假设我的程序是唯一运行的东西——并且有4个线程,每个线程都做完全独立的事情。现在,如果映射是一对一(用户到内核映射),我实际上可以得到完美的4倍加速。但是如果(出于某种原因)所有4个用户线程都映射到同一个内核线程空间-然后由于多处理而没有加速。这是因为,即使我有4个用户级线程-它们在同一个内核空间中运行,并且不能在4个核之间拆分。

不,你完全不对

在大多数情况下,使用posix for C/C++或Thread implementation for Java来创建和运行线程,意味着底层用户空间实现在一个进程的内存空间内运行真正的线程。这意味着,在4个CPU的机器上运行4个线程可以使您的速度提高4倍——当然,如果所有内容都编写正确,并且操作系统也运行正常的话elf不会以某种方式阻止(阻止)平衡CPU-2线程的使用


我说的是“大多数情况”,因为POSIX lib的实现(例如,一些调试或不完整的实现)或Java线程(例如,一些不完整的VM或外来设置)可能永远不会运行真正的线程——只是模拟一下而已……但在标准PC环境中,您可以确定“不,您完全不对”:

在单个内核线程中运行的用户级线程?据我所知,没有一个操作系统可以这样工作。我也无法想象这样的操作系统。更好地记录您的问题。请看。有一种称为多对一的模型,它将多个用户级线程映射到单个内核线程。嗯,更好地称为“fiber”或“co-routine”没有人再使用它们了,因为它们吸收了现代的cpu内核。非常差的cpu缓存位置。我的评论是:它们不会因为差的cpu缓存位置而变得更差。相反,它们不适用于多核处理——因为它们的映射模型(一对多)。事实上,这正是多对一模型的关键点——一个用户级线程块,然后是整个内核线程块。我完全同意你的观点,直到“线程共享一个进程部分的内存空间”。我的怀疑是-“使用pthreadsAPI创建的4个线程-创建4个用户级线程。现在我迷失的地方是——这4个用户级线程如何映射到内核线程?例如,假设所有4个用户级线程都在一个内核线程中运行,那么我真的看不到任何潜在的性能改进。因为不管怎样,内核只运行一个线程,对吗?实际上,给它一些,我想我明白了。所以从本质上说,即使内核只运行一个线程,内核线程也在做更多的工作(因为它运行多个用户级线程)。知道了!!!我不知道具体在哪里,但你不知怎么地漏掉了重点。可能是因为你读过“GNU可移植线程”。算了吧!这只是“POSIX线程”的实现之一,它允许您在不容易启用POSIX的系统上模拟多线程。您的问题:“这4个用户级线程如何映射到内核线程?”我的回答:“实现允许的方式-在大多数情况下(在windows、linux等上)对于内核来说,1个线程是1个独立的线程。内核尽其所能分配每个线程,以在处理内核之间实现平衡。完全正确!!所以你同意我的观点——“它最终取决于内核调度器”。所以,出于某种原因,如果内核不能跨4个内核进行调度,那么您的4个用户级线程实际上不会导致4倍的加速。