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

时间:2016-11-30 00:01:57

标签: multithreading operating-system system-calls

我不明白以下内容:

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

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

1 个答案:

答案 0 :(得分:14)

  

在一个线程创建阻塞系统时的用户级线程中   打电话(例如读)为什么其他线程不能继续他们的工作?

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

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

  

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

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