Operating system 为什么可以';是否有线程进行阻塞系统调用(用户级线程)?

Operating system 为什么可以';是否有线程进行阻塞系统调用(用户级线程)?,operating-system,Operating System,我正在读《现代操作系统》(第四版)。我对这一段不太确定 尽管性能更好,但用户级线程包有一些主要的 问题。首先是如何实现阻塞系统调用的问题。 假设一个线程在任何键被激活之前从键盘读取数据 被击中了。让线程实际执行系统调用是不可接受的,因为 这将停止所有线程 如果一个线程阻塞等待输入,那么另一个线程就不能停止做其他事情吗?为什么它会“停止所有线程”?用户级线程在用户代码中实现;它们不是由内核单独调度的。所有用户级线程都在单个内核调度任务的上下文中运行,因此一个线程不能抢占另一个线程。因此,当一个用户

我正在读《现代操作系统》(第四版)。我对这一段不太确定

尽管性能更好,但用户级线程包有一些主要的 问题。首先是如何实现阻塞系统调用的问题。 假设一个线程在任何键被激活之前从键盘读取数据 被击中了。让线程实际执行系统调用是不可接受的,因为 这将停止所有线程


如果一个线程阻塞等待输入,那么另一个线程就不能停止做其他事情吗?为什么它会“停止所有线程”?

用户级线程在用户代码中实现;它们不是由内核单独调度的。所有用户级线程都在单个内核调度任务的上下文中运行,因此一个线程不能抢占另一个线程。因此,当一个用户线程进行系统调用时,它会阻塞,而另一个用户线程(在同一个内核调度任务中)无法执行


请注意,这不是大多数线程在现代操作系统上的工作方式。Linux上的pthread和NT内核上由CreateThread创建的线程由内核单独调度

语句解决的问题是用户线程被实现为一个库。有一个主线程管理其他线程。主线程使用计时器在各个线程之间切换。在大多数[all?]Unix实现中,阻塞I/O调用会阻止计时器传递到主线程,所有线程都会停止

在内核线程中,操作系统(而不是进程)安排线程执行,因此这不是问题,因为内核没有被阻塞


请记住,引用的语句对于所有操作系统上的用户线程都不是真的。许多非unix系统将向进程发送计时器通知,即使有阻塞I/O请求挂起。

在Tanenbaum OS书中提到:“在用户级线程中,如果一个线程开始运行,该进程中的任何其他线程都不会运行,除非第一个线程自愿放弃CPU”。这与您所说的“主线程使用计时器在各种线程之间切换”相矛盾。您能解释一下吗?这只适用于某些操作系统(尤其是太监)。有软件中断的系统没有问题。