我可以看到你的问题。你有一本可怕的书。
您问的是几个相关的问题。首先,线程的实现一般有两种方式。
1) 线程在库中使用定时器实现。在调度进程执行的系统中,这是执行线程的唯一方法。这是在过去做线程的唯一方法。这个系统通常被称为“用户线程”。用户线程在一个进程中被多路复用。进程自己调度线程。
“用户线程”优于“内核线程”(如下)的神话般的优势在于它们更高效。这就是您引用的段落所指的内容。 “如果线程进行阻塞系统调用,整个进程将阻塞”这句话仅在某些 [unix] 系统上是正确的。
2) 线程在操作系统中实现。一个进程由一个地址空间和一个或多个线程组成。操作系统内核调度线程执行而不是进程。这些是内核线程。
请注意,即使系统支持内核线程,进程也有可能使用用户线程。两者并不相互排斥。但是,原生不支持内核线程的系统只能使用用户线程。
这是解释不同线程模型的简单方法。
-=-=-=-=-=-=-=-=-=-=-=-
一对一、多对一和多对多模型对学生来说是不必要的混淆。现在我们必须进入重叠的术语。
让我们改变一下术语。对于#1,我们将其称为“内核线程”,而不是将可调度的执行单元称为“进程”。在此模型中,每个进程只能有一个内核线程。那么进程中的线程就是“用户线程”。任意数量的用户线程在内核线程内执行/映射到内核线程。这就是多对一模型。用户线程 = 多对一。
如果我们让操作系统创建线程(内核线程),那么理论上我们将正在执行的内容称为“用户线程”。每个用户线程都映射到/在一个且只有一个内核线程中执行。这就是一对一的模型。
多对一模型与通常所说的“用户线程模型”相同。
术语开始变得荒谬,因为只有一个线程,但我们称它为映射到内核线程的用户线程。
一对一模型就是通常所说的内核线程模型。
最后,我们进入多对多模型。这是理论上的BS。理论上,可能有许多用户线程映射到许多内核线程。换句话说,单个用户线程可以在不同的内核线程中执行。我从未听说过以这种方式实现线程的系统,而且我无法想象这样的系统有什么实际优势。
-=-=-=-=-=-=-=-=-=-=-=-=-=-
关于您的最后一个问题,在某些操作系统中,阻塞系统调用阻塞也会阻塞用于实现用户线程的计时器(a/k/a 多对一)。如果一个线程进行阻塞调用,它会阻止进程中的所有其他线程执行,直到阻塞调用完成。
这种阻塞不会发生在所有系统中(操作系统教科书应该指出这一点)。