许多编程语言(如C ++(posix库)和Java)提供了使用用户级线程的能力。但是,如果所有这些用户级线程都在单个内核线程中运行 - 您只能得到多道程序设计或多处理(如果有多个处理器可用)的错觉吗?我的意思是 - 仍然所有这些线程都在同一个内核线程中运行。我说得对吗?并且,如果是,那么我们究竟计划如何使用用户级线程来提高性能?
编辑:我想在多对一模型(用户级线程到内核线程映射)上实际上不可能实现性能。因此,在多对多模型中,只有在内核级线程分离时才能实现性能提升。所以我的问题是,即使用户级线程的开销很低,我也无法像设置内核级线程那样设想性能提升。
EDIT2:基本上这就是我想要验证的 - “假设一台计算机有4个处理器。现在,说我的程序是唯一运行的 - 并且分叉了4个线程,每个线程完成独立的事情。现在,如果映射是一对一(用户到内核映射),我实际上可以获得完美的4倍加速。但是如果说(由于某种原因)所有4个用户线程映射到相同的内核线程空间 - 那么就没有加速因为多处理。这是因为,即使我有4个用户级线程 - 它们运行在相同的内核空间中,并且不能分为4个核心。
答案 0 :(得分:1)
不,你根本就不对。
在大多数情况下,使用posix for C / C ++或Thread实现Java来创建和运行线程,意味着底层用户空间实现在一个进程的内存空间中运行真正的线程。这意味着,在4个CPU的机器上运行4个线程可以实现4倍的加速 - 当然,如果所有内容都正确写入,并且操作系统本身不会以某种方式阻止(阻止)平衡CPU-2线程的使用。 / p>
我说“大多数情况”,因为可能总是实现POSIX lib(例如一些调试或不完整的实现)或Java Threads(例如一些不完整的VM或外来设置),它们不会运行真正的线程 - 只是模拟这......但在标准PC环境中,你可以确定“不,你根本就不对”:)