`
yand789
  • 浏览: 23175 次
社区版块
存档分类
最新评论

Boost ASIO proactor 浅析

 
阅读更多
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在上面的段落中已经讲到了
分享到:
评论

相关推荐

    Boost ASIO C++ 网络编程 中文版 带全书所有例子代码

    **Boost ASIO C++ 网络编程 中文版 带全书所有例子代码** Boost ASIO 是一个用于编写异步网络应用程序的库,它为C++开发者提供了强大而灵活的工具。这本书《Boost.Asio C++ Network Programming》中文版,结合了...

    利用Boost Asio库开发的大并发量,高性能的网络通讯库,有线程池和即时,定时任务调度功能.zip

    利用Boost Asio库开发的大并发量,高性能的网络通讯库,有线程池和即时,定时任务调度功能.zip 利用Boost Asio库开发的大并发量,高性能的网络通讯库,有线程池和即时,定时任务调度功能.zip 利用Boost Asio库开发的...

    boost-asio-cpp-network-programming.zip_BOOST教程_Boost_boost asio

    **Boost.Asio库详解** Boost.Asio是Boost库的一部分,专为C++设计,用于处理I/O操作,如网络通信。这个库提供了低级和高级的接口,使得开发者能够高效地编写并发网络应用程序。Boost.Asio的核心在于其异步模型,它...

    Boost ASIO C++ 网络编程

    Boost ASIO是C++库中的一个强大工具,用于进行异步网络编程。它提供了一种统一的接口,可以处理各种I/O操作,包括TCP、UDP、套接字、多路复用、本地进程通信等。在C++网络编程中,Boost ASIO是一个不可或缺的组件,...

    c++ boost asio http get post请求

    在C++编程中,Boost库是一个非常重要的工具集,它为C++标准库提供了许多扩展功能,其中包括Boost.Asio库。Boost.Asio是用于网络编程的模块,它提供了低级和高级的网络通信接口,包括TCP、UDP、套接字以及HTTP等协议...

    C++中文版网络编程boost asio.docx

    ### C++中文版网络编程Boost Asio知识点概览 #### 一、Boost Asio简介与基础知识 ##### 1.1 Boost Asio概述 - **定义**:Boost Asio 是一个跨平台的 C++ 库,它提供了一种简单且统一的方式来访问底层网络编程接口...

    Boost ASIO C++ 网络编程-带实例

    Boost ASIO是C++编程中一个强大的库,用于处理I/O操作,特别是在网络编程中,它提供了异步和同步的接口。本知识点将深入探讨Boost ASIO库在C++网络编程中的应用,以及如何通过实例来理解其核心概念。 1. **Boost库...

    Boost.Asio C++ 网络编程.pdf

    **Boost.Asio C++ 网络编程**是C++编程领域中专注于网络通信的一门技术,由Boost库提供支持。Boost.Asio是Boost库的一部分,它为C++程序员提供了低级和高级的网络API,使得开发高效、可扩展的网络应用程序变得简单。...

    Boost.Asio C++ 网络编程 中文版

    ### Boost.Asio C++ 网络编程知识点 #### Boost.Asio 入门 - **什么是Boost.Asio?** Boost.Asio是一个跨平台的C++库,用于网络和低级I/O编程。它提供了简单而强大的方式来处理异步I/O。 - **历史**:Boost.Asio的...

    基于boost.asio库的C++http/https web server

    Boost.ASIO库是Boost库的一部分,它提供了异步I/O操作,使得处理网络通信变得更加高效。在这个项目中,我们看到一个使用Boost.ASIO实现的Web服务器,它同时支持HTTP和HTTPS协议,这对于创建安全的Web服务至关重要。 ...

    boost asio tcp服务器的实现

    Boost.Asio库为C++程序员提供了一种高效、灵活的方式来处理网络通信,包括TCP协议。本篇文章将详细探讨如何使用Boost.Asio实现一个TCP服务器,以及涉及的关键技术点。 首先,`boost::asio`是一个强大的C++库,它...

    基于boost asio的tcp、ssl 网络编程,简单好用

    **Boost.Asio库详解** Boost.Asio是C++的一个库,它为网络编程提供了一种高效且易于使用的接口。这个库被广泛应用于开发TCP、UDP和SSL(安全套接层)网络应用程序,包括服务器和客户端。Boost.Asio的核心概念是异步...

    boost asio 网络编程

    1. **前摄器(Proactor)模式**:这是 Boost Asio 中的一个核心设计理念,允许程序在 I/O 操作完成后被通知。这与传统的反应器(Reactor)模式不同,后者是在 I/O 准备就绪时被通知。 2. **线程和 Boost Asio**:...

    c++ boost asio网络库 异步tcp方式文件传输 速度在10M左右.zip

    C++ Boost ASIO库是C++开发者用于网络编程的一个强大工具,它提供了高效、灵活的异步I/O操作。在TCP(传输控制协议)网络通信中,Boost.ASIO允许开发人员实现高效的文件传输,尤其是在大数据量的情况下。在这个场景...

    Boost.Asio C++ Network Programming(高清,带书签,可复制)

    《Boost.Asio C++ Network Programming》是一本深入探讨C++网络编程的专业书籍,主要围绕Boost.Asio库展开,该库是C++标准库在异步网络编程领域的一个强大补充。Boost.Asio提供了一种简洁、高效的方式来处理网络通信...

    《Boost Asio C++ Network Programming 》 英文原版

    《Boost Asio C++ Network Programming》 概述: 《Boost Asio C++ Network Programming》是一本英文原版书籍,作者为知名的 C++ 专家 John Torjo。该书籍旨在帮助读者学习使用 Boost Asio 进行 C++ 网络编程。书...

    Boost.Asio C++ Network Programming Cookbook.pdf

    Boost.Asio C++ Network Programming Cookbook.pdf Boost.Asio C++ Network Programming Cookbook.pdf

    Boost.Asio C++ Network Programming Cookbook 原版pdf by Radchuk

    The Boost.Asio library is aimed at reducing accidental complexity by introducing type systems and exploiting object-oriented methods, and decreasing the development time by providing high degrees of ...

    一个boost asio简单的性能测试代码

    boost asio性能测试和研究的例子 asio异步处理方式cpu消耗较高,同样的处理,确比同步方式还要高出一倍的cpu利用率,还能不能用啊

Global site tag (gtag.js) - Google Analytics