为什么一个线程可以进行阻塞系统调用(用户级线程)?

时间:2015-12-18 03:28:25

标签: operating-system

我正在阅读现代操作系统(第4版)。我对这一段并不十分确定。

  

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

如果一个线程阻塞等待输入,那么另一个线程可以不做其他事吗?为什么它会停止所有线程"?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

在内核线程中,操作系统(不是进程)调度线程以便执行,因此这不是问题,因为内核没有被阻止。

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