我不明白以下几点:
用户级线程需要非阻塞系统调用,即多线程内核.否则,即使进程中仍有可运行的线程,整个进程也会在内核中被阻塞。
内核线程如何处理阻塞系统调用?在用户级线程中,当一个线程执行阻塞系统调用(例如read)时,为什么其他线程不能继续它们的工作?
发布于 2016-11-30 05:52:18
在用户级线程中,当一个线程执行阻塞系统调用(例如read)时,为什么其他线程不能继续它们的工作?
对于用户级线程,就操作系统和内核而言,进程中只有一个线程在运行。一个线程可能正在执行一些巧妙的技巧(比如从一个用户线程上下文切换到另一个用户线程上下文),但它仍然只是一个在多个指令流之间周期性地来回切换的线程。
因此,当该单线程调用阻塞系统调用时,该单线程必须阻塞,直到系统调用返回为止,并且当它被阻塞时,它什么也做不了。特别是在阻塞时它不能做的一件事是切换到另一个用户线程上下文并运行一些更多的代码,因为没有办法调用切换到其他用户线程上下文例程。谁会叫它?唯一可用的“真实”线程是在系统调用中被阻塞的线程,它不能这样做,因为它在系统调用中被阻塞。
内核线程如何处理阻塞系统调用?
对于内核线程,内核知道进程中的所有线程,因为内核创建了它们(代表应用程序)并直接管理它们,因此内核可以直接调度它们中的任何一个。因此,当线程A在系统调用中阻塞时,内核/调度程序可以继续运行线程B一段时间,因为内核知道线程B存在。(与用户线程的情况相比,内核无法安排线程B运行,因为内核不知道线程B的存在;只有用户应用程序本身知道用户级线程的存在)。
https://stackoverflow.com/questions/40877998
复制相似问题