Boost ASIO proactor 浅析

前情提要:

Boost asio 的socket的异步非阻塞模式才有的是proactor模式,当IO操作介绍后回调相应的处理函数。ASIO在Linux平台下的实现基于epoll,但是epoll只支持reactor模式,ASIO通过封装在epoll上实现了proactor。提到ASIO proactor,ASIO中的所有异步操作都是基于io_service实现的,io_service是ASIO中的任务队列,并且他负责调用epoll_wait等待IO事件到来,对io_service的实现参加前边的blog:http://www.cnblogs.com/zhiranok/archive/2011/09/04/boost_asio_io_service_CPP.html

Proactor 和 Rector:

两种设计模式网上已经有很多种解释,这两种模式都是针对IO操作的,我的理解是Rector只是告诉调用者什么时候事件到来,但是需要进行什么操作,需要调用者自己处理。Preactor不是当事件到来时通知,而是针对此事件对应的操作完成时,通知调用者,一般通知方式都是异步回调。举例,Reactor中注册读事件,那么文件描述符可读时,需要调用者自己调用read系统调用读取数据,若工作在Preactor模式,注册读事件,同时提供一个buffer用于存储读取的数据,那么Preactor通过回调函数通知用户时,用户无需在调用系统调用读取数据,因为数据已经存储在buffer中了。显然epoll是Reactor的。

ASIO 的实现:

Epoll的封装:

l boost/asio/detail/epoll_reactor.hpp 是epoll_reatcor的封装,class epoll_reactor有两个作用,任务队列和调用epoll_wait,支持的操作类型有read、write、connect、except。其实现文件为boost/asio/etail/impl/epoll_reactor.ipp,主要的实现逻辑有run和start_op。

n Run函数的逻辑是:调用一次epoll_wait,得到相应的IO事件

n 遍历相应IO事件,若是专门用于中断epoll操作的文件描述符那么跳过

n 若是用于定时器的文件描述符,则设置标志变量check_timers为true

n 若是基本IO事件,依次检查其IN、OUT事件,except事件会首先检测,将次事件对应的队列上的操作全部执行完毕(先调用io_servie::post,然后被调用)。

n 若check_timers标志变量被设置,那么将已经超时的操作通过io_service::post调用

l start_op的实现:

n Start_op需要事件的类型、文件描述符、回调函数做参数,首先调用perform,也就是直接send,send若成功直接调用io_service::post调用回调函数

n 如果文件描述符没有注册到epoll_wait,那么EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLOUT | EPOLLPRI | EPOLLET 全部注册到epoll_wait。

n 每个文件描述符有自己的队列,该事件的回调函数会被添加到队列中。

boost::asio::ip::tcp::socket中的异步方法的实现

l Socket中有async_打头的许多异步方法,这里已async_send为例

l boost/asio/ip/tcp.hpp 声明了tcp::socket的原型,实际原型是

typedef basic_stream_socket<tcp> socket;

l basic_stream_socket是模板类,声明在boost/asio/basic_stream_socket.hpp文件中,async_send操作只是简单的为

this->service.async_send(this->implementation, buffers, 0, handler);

而service的原型是什么呢?

basic_stream_socket继承于basic_socket<Protocol, stream_socket_service>,而 stream_socket_service声明文件为boost/asio/stream_socket_service.hpp,L60中

typedef detail::reactive_socket_service<Protocol> service_impl_type;告诉我们service的原 型是detail::reactive_socket_service<tcp>,其声明文件为

boost/asio/detail/reactive_socket_service.hpp

l async_send操作实现逻辑为:

n 先分配一个回调函数,调用start_op,start_op的实现在detail/reactive_socket_service_base.ipp文件中,只是简单的向epoll_reactor调用start_op方法注册write_op。start_op在上面的段落中已经讲到了。

转载于:https://www.cnblogs.com/zhiranok/archive/2011/10/07/boost-asio-proactor.html

Boost ASIO proactor 浅析相关推荐

  1. 【Boost】boost库asio详解6——boost::asio::error的用法浅析

    1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy  print? boost::system::error_code error 我们用这 ...

  2. Boost::Asio::Error的用法浅析

    一般而言我们创建用于接收error的类型大多声明如下: boost::system::error_code error 我们用这个类型去接受在函数中产生的错误 如 socket.connect( en ...

  3. boost asio 应用方法学(二)——深入框架

    要用好它,就必须先了解它,而且不能停止于表面,必须深入到内部.而了解一件事物,先要了解它的框架,再了解它的细节.了解了框架,我们就有了提纲挈领的认识. 关于 boost asio 框架结构,在其文档中 ...

  4. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  5. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  6. boost.asio异步并发Tcp服务器

    简介 boost的asio采用的是Proactor模型,该模型的核心思想就是异步IO,IO在事件循环中,每个异步IO都绑定对应的回调函数,当IO完成后,对应的回调函数会在事件循环中执行. 异步并发模型 ...

  7. Boost::asio概览

    Boost::asio核心的概念和功能 asio的最核心的功能是用于异步的IO通信, 比如通过文件 网络或者控制台等. asio提供了一系列的工具来处理这种长时间的IO操作, 而且执行这些操作不需要依 ...

  8. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  9. boost asio ——深入框架

    要用好它,就必须先了解它,而且不能停止于表面,必须深入到内部.而了解一件事物,先要了解它的框架,再了解它的细节.了解了框架,我们就有了提纲挈领的认识. 关于 boost asio 框架结构,在其文档中 ...

最新文章

  1. j2ee学习 +“云未来
  2. Ardino基础教程 9_数字电压表
  3. Android 通过字符串来获取R下面资源的ID 值 文字资源
  4. nmf算法 python_NMF算法简介及python实现
  5. 深度学习文本分类在支付宝投诉文本模型上的应用
  6. 跑腿同学校园小程序源码-已测试
  7. MinIO Docker 快速入门 ​​​​​​​
  8. linux嵌入式移植培训,达内嵌入式培训大讲堂之Linux系统移植
  9. Hbase的基于快照的表修复
  10. 【190111】VC+Access工程信息管理系统源代码
  11. 摄动法在计算机中的应用,渐近分析与摄动方法的计算机辅助求解.pdf
  12. word2010转html默认页面视图,word2010中,切换到页面视图方式的组合键
  13. Python爬英雄联盟lol全英雄皮肤
  14. 【Linux】kibana安装与使用教程
  15. 修改内部emmc 和外部sdcard 挂载点
  16. Caffeine一级缓存介绍和应用
  17. 【ManageEngine】终端管理系统,助力华盛证券数字化转型
  18. HTML5七夕情人节表白网页(粉色的情人节爱心飞出ui特效) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心
  19. java双人游戏_Java 简易双人坦克游戏实现
  20. 老板:你们和外包有什么区别?

热门文章

  1. python爬取股票网站的历史周价格
  2. 【Qt Quick】qml浮点数精度
  3. 软件工程 - 项目管理
  4. WWDC15 iOS游戏开发3个新框架全解
  5. 手工测试1年经验面试,张口要13K,我真是服了····
  6. 洛谷 P5717 【深基3.习8】三角形分类
  7. java 环境变量的设置
  8. Codeforces 1280C: Jeremy Bearimy
  9. 专攻心脑疾病AI市场,数坤科技完成创世伙伴领投2亿元B轮融资...
  10. 有关宾大1900页数学书笔记的更新说明