异步IO是只有一个线程吗?所有的IO操作都是这个线程处理的吗?

发布于 2022-09-12 03:12:33 字数 452 浏览 17 评论 0

我看到这段关于异步IO的话:

消息模型是如何解决同步IO必须等待IO操作这一问题的呢?当遇到IO操作时,代码只负责发出IO请求,不等待IO结果,然后直接结束本轮消息处理,进入下一轮消息处理过程。当IO操作完成后,将收到一条“IO完成”的消息,处理该消息时就可以直接获取IO操作结果。

在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起,但异步IO模型下,主线程并没有休息,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力。

我有地方不理解:
1.『这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。』这里说明异步IO只用到1个线程,这里也就是说所有的IO操作都是这个主线程(唯一线程)来做的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心不设防 2022-09-19 03:12:33

你这是咋读的……

一个线程就可以同时处理多个 I/O 请求”,也没说 “只有一个线程同时处理多个 I/O 请求” 啊,更没说这个线程就一定是主线程啊。

可以有多个线程都处理 I/O 啊,而且这多个线程每个线程都能同时处理多个,比如一个线程专门处理磁盘 I/O,一个线程只处理网络 I/O,一个线程只接受键盘鼠标 I/O,完全是可以的。

另外确实有一些开发框架(大多数是 GUI 类)的,要求在主线程里处理 I/O,但这是人家自己的规定,不是操作系统的要求。也有很多框架要求不能在主线程里处理某些 I/O,比如 Android 就要求不能在主线程(即 UI 线程)里访问 Socket。所以你看,你也可以不在主线程里处理,都是可以的,取决于你怎么去设计和实现。

呢古 2022-09-19 03:12:33

正确。单线程处理多个 IO时,确实是所有操作都是由主线程做的,所以主线程不能干消耗时间的操作(比如读取个数据库啥的),因为会影响消息轮训

剑心龙吟 2022-09-19 03:12:33

假设线程池里面有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请求(所谓的同时是切片实现),至于说哪个线程可就不一定了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文