开发者社区 问答 正文

阻塞IO是线程调用read方法后,等待操作系统拷贝数据吗?

线程调用系统调用read方法后,线程被阻塞,此时线程处于阻塞状态,在线程阻塞队列里面吗?然后操作系统将内核缓冲区的数据拷贝到线程空间内,拷贝完了,通知线程,线程变为就绪的状态???是这样吗??

展开
收起
magicalman 2021-10-22 16:20:11 612 分享 版权
阿里云 AI 助理回答

当一个线程调用系统调用read方法去读取文件、套接字等资源的数据,如果数据没有立即可用(比如,数据还在从磁盘读入内核缓冲区,或者网络数据还没有到达),那么这个线程确实会被操作系统挂起(即阻塞)。此时,线程会从用户态切换到内核态,并且其状态变为阻塞。不过,关于“在线程阻塞队列里面”的说法,更准确的表述是,线程被放置在某个与之相关的等待队列上,这个队列通常由操作系统内核管理,而不直接称为“线程阻塞队列”。每个系统调用可能对应不同的等待队列。

接下来,一旦数据准备好了(例如,内核完成了从磁盘到内核缓冲区的数据拷贝,或者网络数据已经到达并存入内核缓冲区),操作系统会将该线程从等待队列中移出,并将其状态改为就绪状态。然后,该线程会被放入可运行(就绪)队列,等待CPU调度器分配处理器时间片来执行。一旦获得CPU时间,线程就可以继续执行,此时操作系统会将内核缓冲区中的数据拷贝到用户空间,完成read操作。

总结来说,你的理解大体正确,但需要注意的是,具体的实现细节可能会根据操作系统(如Linux、Windows等)和具体环境有所不同。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答