异步IO是只有一个线程吗?所有的IO操作都是这个线程处理的吗?
我看到这段关于异步IO的话:
消息模型是如何解决同步IO必须等待IO操作这一问题的呢?当遇到IO操作时,代码只负责发出IO请求,不等待IO结果,然后直接结束本轮消息处理,进入下一轮消息处理过程。当IO操作完成后,将收到一条“IO完成”的消息,处理该消息时就可以直接获取IO操作结果。在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起,但异步IO模型下,主线程并没有休息,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力。
我有地方不理解:
1.『这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。』这里说明异步IO只用到1个线程,这里也就是说所有的IO操作都是这个主线程(唯一线程)来做的吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你这是咋读的……
“一个线程就可以同时处理多个 I/O 请求”,也没说 “只有一个线程同时处理多个 I/O 请求” 啊,更没说这个线程就一定是主线程啊。
可以有多个线程都处理 I/O 啊,而且这多个线程每个线程都能同时处理多个,比如一个线程专门处理磁盘 I/O,一个线程只处理网络 I/O,一个线程只接受键盘鼠标 I/O,完全是可以的。
另外确实有一些开发框架(大多数是 GUI 类)的,要求在主线程里处理 I/O,但这是人家自己的规定,不是操作系统的要求。也有很多框架要求不能在主线程里处理某些 I/O,比如 Android 就要求不能在主线程(即 UI 线程)里访问 Socket。所以你看,你也可以不在主线程里处理,都是可以的,取决于你怎么去设计和实现。
正确。单线程处理多个 IO时,确实是所有操作都是由主线程做的,所以主线程不能干消耗时间的操作(比如读取个数据库啥的),因为会影响
消息轮训
假设线程池里面有4个空闲的线程:A,B,C,D
当IO1 完成时,系统找了一个空闲的线程A,通过 A 线程来回调IO1的“IO完成”回调函数来处理IO1。
这时候IO2完成了,系统又开始找空闲的线程,如果这时候 A 线程已经处理完 IO1 了,就会把 IO2 交给 A 线程去执行,如果 A 线程还在处理 IO1,系统就会唤醒线程 B 来处理 IO2 的回调。
如果 A, B, C, D 四个线程都在忙,系统就会等待,直到某个线程空闲为止。
所以说一个线程可以处理多个IO请求(所谓的同时是切片实现),至于说哪个线程可就不一定了。