线程调用系统调用read方法后,线程被阻塞,此时线程处于阻塞状态,在线程阻塞队列里面吗?然后操作系统将内核缓冲区的数据拷贝到线程空间内,拷贝完了,通知线程,线程变为就绪的状态???是这样吗??
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
当一个线程调用系统调用read
方法去读取文件、套接字等资源的数据,如果数据没有立即可用(比如,数据还在从磁盘读入内核缓冲区,或者网络数据还没有到达),那么这个线程确实会被操作系统挂起(即阻塞)。此时,线程会从用户态切换到内核态,并且其状态变为阻塞。不过,关于“在线程阻塞队列里面”的说法,更准确的表述是,线程被放置在某个与之相关的等待队列上,这个队列通常由操作系统内核管理,而不直接称为“线程阻塞队列”。每个系统调用可能对应不同的等待队列。
接下来,一旦数据准备好了(例如,内核完成了从磁盘到内核缓冲区的数据拷贝,或者网络数据已经到达并存入内核缓冲区),操作系统会将该线程从等待队列中移出,并将其状态改为就绪状态。然后,该线程会被放入可运行(就绪)队列,等待CPU调度器分配处理器时间片来执行。一旦获得CPU时间,线程就可以继续执行,此时操作系统会将内核缓冲区中的数据拷贝到用户空间,完成read
操作。
总结来说,你的理解大体正确,但需要注意的是,具体的实现细节可能会根据操作系统(如Linux、Windows等)和具体环境有所不同。