IO多路复用机制详解 (2)

IO多路复用机制详解

 

异步IO

 真正的异步IO,需要操作系统更强的支持,在IO多路复用中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据,而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。异步模型使用Proactor设计模式实现这一机制。

Proactor和Reactor模式在结构上比较相似,在Client使用方式上差别较大,Proactor模式中,用户线程将AO、Proactor以及操作完成时的CompletionHandler注册到AOP。AOP使用Facade模式提供一组异步操作API供用户使用,当用户线程调用异步API后,便执行自己的任务。AOP会开启独立的内核线程执行异步操作,当异步IO完成时,AOP将用户线程与AOP一起注册的Proactor和CompletionHandler取出,然后将CompletionHandler与IO操作的结果一致转发给Proactor,Proactor负责回调每一个异步操作事件完成处理函数handle-event,Proactor模式中每个异步操作都可以绑定一个proactor对象,一般操作系统中Proactor为单例模式,以便集中化分发操作完成事件。

IO多路复用机制详解

 

异步IO模型中,用户线程直接使用内核提供的异步IO API发起read请求,发起后立即返回,继续执行用户线程代码。此时用户线程已经将调用的AO与CH注册到了内核,然后操作系统开启独立的内核线程去处理IO操作。当read请求的数据到达时,由内核负责读取socket中的数据,并写入用户指定的缓冲区中。最后内核将read的数据和用户线程注册的CH分发给内部Proactor,Proactor将IO完成的信息通知给用户线程,完成异步IO。

异步IO并不常见,高性能并发服务程序,使用IO多路复用模型+多线程任务处理的架构基本可以满足要求,目前操作系统对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式,IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjffw.html