【发布时间】:2011-08-19 17:24:03
【问题描述】:
C++(posix 库)和 Java 等许多编程语言都提供了使用用户级线程的能力。但是,如果所有这些用户级线程都在单个内核线程中运行 - 您只会得到多道程序或多处理(如果有多个处理器可用)的错觉,对吗?我的意思是——所有这些线程仍然在同一个内核线程中运行。我这样说对吗?如果是,那么我们究竟打算如何使用用户级线程来提高性能?
编辑:我想在多对一模型(用户级线程到内核线程映射)上性能实际上是不可能的。因此,在多对多模型中,只有在内核级线程分叉的情况下,才有可能提高性能。所以我的问题是,即使用户级线程的开销很低,我也无法真正想象出与调度内核级线程一样大的性能提升。
EDIT2:基本上这就是我想要验证的内容 - “假设一台计算机有 4 个处理器。现在,假设我的程序是唯一运行的东西 - 并且分叉了 4 个线程,每个线程都做完全独立的事情。现在,如果映射是一对一的(用户到内核映射),我实际上可以获得完美的 4 倍加速。但是,如果说(出于某种原因)所有 4 个用户线程都映射到同一个内核线程空间 - 那么就没有加速因为多处理。这是因为,即使我有 4 个用户级线程 - 它们在同一个内核空间中运行并且不能跨 4 个内核拆分。
【问题讨论】:
-
在单个内核线程中运行的用户级线程?据我所知,没有一种操作系统可以以这种方式工作。我也想不出一个。更好地记录您的问题。
-
看en.wikipedia.org/wiki/GNU_Portable_Threads。有一种称为多对一的模型,它将多个用户级线程映射到单个内核线程。
-
嗯,俗称“纤程”或“协程”。没有人再使用它们,因为它们吸收了现代 cpu 内核。 cpu 缓存局部性非常差。
-
我的评论是:它们并没有因为 cpu 缓存局部性差而变得更糟。相反,它们不适用于多核处理 - 因为它们的映射模型(一对多)。
-
事实上,这正是多对一模型的缺点——一个用户级线程阻塞,然后是整个内核线程阻塞。
标签: multithreading operating-system