为什么阻止系统调用会阻止用户级线程的整个过程?

use*_*593 6 multithreading operating-system system-calls

我不明白以下几点:

用户级线程需要非阻塞系统调用,即多线程内核.否则,即使进程中仍有可运行的线程,整个进程也会在内核中被阻塞.

内核线程如何处理阻塞系统调用?在一个线程正在进行阻塞系统调用(例如读取)的用户级线程中,为什么其他线程无法继续工作?

Jer*_*ner 16

在一个线程正在进行阻塞系统调用(例如读取)的用户级线程中,为什么其他线程无法继续工作?

对于用户级线程,就操作系统和内核而言,在该过程中只有一个线程在运行.那个线程可能正在做一些聪明的技巧(比如从一个用户线程上下文切换到另一个),但它仍然只是一个单独的线程,它在几个指令流之间定期来回切换.

因此,当该单个线程调用阻塞系统调用时,该单个线程必须阻塞,直到该系统调用返回,并且当它被阻塞时,它不能执行任何操作.有一件事在特别的是,虽然阻止它不能做的就是切换到另一个用户线程上下文和运行一些更多的代码,因为没有方法来调用切换到该-其他用户线程上下文例程.谁会叫它?唯一可用的"真正"线程是在系统调用中被阻塞的线程,并且由于它在系统调用中被阻塞而无法执行.

内核线程如何处理阻塞系统调用?

对于内核线程,内核知道进程内的所有线程,因为内核(代表应用程序)创建它们并直接管理它们,因此内核可以直接调度它们中的任何一个.因此,当线程A阻塞系统调用时,内核/调度程序可以继续运行线程B一段时间,因为内核知道线程B存在.(与用户线程情况对比,内核无法调度线程B运行,因为内核不知道线程B存在;只有用户应用程序本身知道用户级线程的存在)

  • 请注意,解决此问题的方法是提供(替代?)非阻塞内核 API 函数 - 例如,内核尽快返回但随后向用户空间发送某种“那件事完成”通知(当线程如果已被阻止,则已被解锁)。 (2认同)