当用户级线程阻塞时,关于“对等线程”阻塞的困惑

AMA*_*MAR 6 java multithreading operating-system cpu-architecture green-threads

我正在阅读线程和进程之间的差异,并且几乎在网上到处都是,一个差异通常没有太多解释:

如果一个进程被阻塞,剩余的进程可以继续执行。如果一个用户级线程被阻塞,它的所有对等线程也会被阻塞。

这对我没有任何意义。如果调度程序不能在阻塞线程和就绪/可运行线程之间切换,那么并发的意义是什么。给出的原因是,由于操作系统不区分给定父进程的各个线程,因此它会立即阻止所有线程。

我觉得这很不令人信服,因为所有现代操作系统都有带有线程 ID 的线程控制块,即使它仅在父进程的内存空间内有效。就像 Galvin 的《操作系统》一书中给出的示例一样,如果拼写检查线程无法连接到某个在线词典,我不希望正在处理我的打字的线程被阻塞。

要么我对这个概念的理解有误,要么所有这些网站多年来都只是复制了一些旧的线程差异。此外,我在书中找不到这种说法,例如 Galvin 的书或 William Stalling 的 COA 书,其中讨论了线程。

提前致谢。

编辑: 这些是我找到语句的资源:

aku*_*ykh 5

内核线程和用户级线程之间存在差异。简单来说:

  • 内核级线程:由操作系统管理的线程,包括调度。它们是在处理器上执行的内容。这可能是我们大多数人对线程的看法。
  • 用户级线程:由程序本身管理的线程。在某些情况下,它们也被称为纤程或协程。与内核级线程相反,它们需要“让执行”,即从一个用户级到另一个用户级线程的切换是由程序明确完成的。用户级线程映射到内核级线程。

由于用户级线程需要映射到内核级线程,因此需要选择合适的映射。您可以将每个用户级别映射到单独的内核级别线程。您还可以将多个用户级映射到一个内核级线程。在后一个映射中,“正如我们所知”,您让多个并发执行路径由单个线程执行。如果这些路径之一阻塞,请记住用户级线程需要让出执行,然后执行(内核级)线程阻塞,这会导致所有其他分配的路径也被有效阻塞。我想,这就是声明所指的内容。仅供参考:在 Java 中,用户级线程(您在程序中执行的多线程)由 JVM(即运行时系统)映射到内核级线程。


相关资料: