首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么阻塞系统调用用用户级线程阻塞整个过程?

问为什么阻塞系统调用用用户级线程阻塞整个过程?
EN

Stack Overflow用户
提问于 2016-11-30 00:01:57
回答 1查看 7.7K关注 0票数 9

我不明白以下几点:

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

内核线程如何处理阻塞系统调用?在用户级线程中,当一个线程执行阻塞系统调用(例如read)时,为什么其他线程不能继续它们的工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 05:52:18

在用户级线程中,当一个线程执行阻塞系统调用(例如read)时,为什么其他线程不能继续它们的工作?

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

因此,当该单线程调用阻塞系统调用时,该单线程必须阻塞,直到系统调用返回为止,并且当它被阻塞时,它什么也做不了。特别是在阻塞时它不能做的一件事是切换到另一个用户线程上下文并运行一些更多的代码,因为没有办法调用切换到其他用户线程上下文例程。谁会叫它?唯一可用的“真实”线程是在系统调用中被阻塞的线程,它不能这样做,因为它在系统调用中被阻塞。

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

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

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40877998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档