zl程序教程

您现在的位置是:首页 >  Python

当前栏目

System|IO|Proactor

2023-03-15 22:01:42 时间

Reference: https://www.dre.vanderbilt.edu/~schmidt/PDF/Proactor.pdf

Proactor是常见的网络AIO模型。和Reactor的区别在于同步/异步。问题在于windows没有好的NIO,而Linux又没动力实现AIO,所以Reactor占多数。

与Reactor模式的对比见

静态

  • Proactive Initiator - 应用程序
  • Completion Handler - 事件处理函数
  • Asynchronous Operation - OS提供的AIO原语
  • Asynchronous Operation Processor - OS
  • Completion Dispatcher - 当事件完成时执行callback

动态

  • 应用层确定Dispatcher和Handler
  • 应用层向OS注册AIO、Handler以及所属的Dispatcher
  • OS执行AIO
  • AIO执行完成后OS通知Dispatcher
  • Dispatcher执行对应的Handler

示例

连接

特殊的Handler名为Acceptor。Acceptor本身负责监听特定的端口(如80),用于创建socket连接。Acceptor特殊在Handler能够注册新的Handler。

注册AIO accept->accpet完成->回调处理create->注册AIO read

IO

已注册的AIO read->read完成->回调处理read文件->注册AIO write->write完成->响应

异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作。

总结

异步明显比同步复杂很多,OS能够直接把数据从kernel buffer扔进用户buffer,而相比较而言,Reactor仅仅是获知数据准备好了,想要获取数据还需要再进行同步读取。

在性能上异步应该是有一定优势的,但是Linux直接用epoll模拟AIO,所以在Linux上做Proactor是多此一举,服务器依然以Reactor为主流。