Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
391 views
in Technique[技术] by (71.8m points)

异步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操作都是这个主线程(唯一线程)来做的吗?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

你这是咋读的……

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...