【注】本文不是boost asio的完整应用讲述,而是仅对其中要点的讲解,主要参考了Boost Asio 1.68的官方文档(https://www.boost.org/doc/libs/1_68_0/doc/html/boost_asio/overview.html),代码的测试环境为ubuntu 18.04,asio的编译及安装不在本文的范围之内。

一、基本工作流程
下图来自boost asio的官网,显示了Asio的基本工作流程。

图1是同步工作方式,你的程序调用I/O接口(通过I/O object,步骤1),其实是调用了io_context的接口(步骤2),io_context调用了操作系统I/O接口(步骤3),等待,操作系统返回(步骤4),io_context返回(步骤5),I/O object返回给你的程序(步骤6)。如果不用Asio的话,你的程序直接调用操作系统接口,等待,然后操作系统返回(类似只有步骤1调用,步骤6返回,但调用的是操作系统中的东西)。

图2是异步工作方式(两个阶段),第一阶段,你的程序调用I/O接口(通过I/O object,步骤1),同时提供一个完成句柄(函数),其实是调用了io_context的接口(步骤2),io_context告诉操作系统有异步I/O(步骤3),操作系统开始工作并直接返回。第二阶段,操作系统在核心态完成I/O操作后,将结果拷贝出来,然后通知io_context(步骤4),同时你的程序也可以抽空做点别的事情(不能太多,否则阻塞了完成消息的处理),然后调用io_context.run(),将控制权交回io_context(步骤5,否则你的完成句柄函数得不到调用)。io_context调用完成句柄函数。步骤4和步骤5其实不分先后,同时发生。

无论同步或异步方式,io_context都处于中心地位,它负责与操作系统发生关系,同步时,它封装了操作系统的I/O调用,异步时,它通知操作系统要进行I/O,准备好异步操作的相关参数,同时,它需要维护一个队列(同时进行的异步I/O操作不止一个),保证操作系统的操作完成后,找到对应的完成句柄函数,然后调用它。

二、Proactor模式
Boost.Asio用的是Proactor模式。要理解Poactor,先要理解同步/异步和阻塞/非阻塞概念。网上已有多篇文章论述。其实,各人在IO处理时,对同步/异步,阻塞/非阻塞的理解并不完成一致,下面两个图分别来自UNIX Network Programming和微软的官方网站,它们就有点区别,微软网文的处理比较简洁,似乎同步就意味着阻塞,异步就意味着非阻塞。UNIX书中阻塞/非阻塞是指用户调用系统IO函数时是否立即返回,同步/异步是指系统将IO操作的结果告诉用户的方式。

上图来自UNIX Network Programming

上图来自微软的网文“Synchronous and Asynchronous I/O”

Proactor/Reactor模式也是否相像,二者都靠消息来驱动,都有回调函数,Proactor中,系统为你做了更多,告诉你结果,Reactor中,只是告诉你有事情发生了,可以做点什么了。

需要说明的是,并不是所有场合非阻塞异步方式的性能都最高,其实活还是那么多,系统帮你多做了些而已。如果只有少数几个连接,多线程+同步方式也许更适合。
————————————————
版权声明:本文为CSDN博主「guxch」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guxch/article/details/83501443

Boost Asio要点概述(一)的更多相关文章

  1. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  2. c++ boost asio库初学习

    前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...

  3. 如何在多线程leader-follower模式下正确的使用boost::asio。

    #include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...

  4. BOOST.Asio——Tutorial

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  5. boost asio sync

    Service: #include<boost/asio.hpp> #include<boost/thread.hpp> #include<iostream> #i ...

  6. 网络库crash以及boost asio strand dispath分析

    最近在做服务器的稳定性的相关测试,服务器的网络底层使用的是boost asio,然后自己做的二次封装以更好的满足需求. 服务器昨天晚上发现crash了一次,之前测试了将近半个多月,有一次是莫名的退出了 ...

  7. boost asio tcp server 拆分

    从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...

  8. boost::asio 使用实例

    #include <iostream> #include <boost/asio.hpp> using namespace std; using namespace boost ...

  9. boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)

    * Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...

随机推荐

  1. 基于Vue简易封装的快速构建Echarts组件 -- fx67llQuickEcharts

    fx67llQuickEcharts A tool to help you use Echarts quickly! npm 组件说明 这本来是一个测试如何发布Vue组件至npm库的测试项目 做完之后 ...

  2. Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列+线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...

  3. R 小知识积累

    1.grep 1 ## a为一个data frame,取含有RNA-Seq的行 2 index <- grep("RNA-Seq", a$Assay_Type) 3 b &l ...

  4. Python压缩&解压缩

    Python中常用的压缩模块有zipfile.tarfile.gzip 1.zipfile模块的简单使用 import zipfile # 压缩 z1 = zipfile.ZipFile('zip_t ...

  5. gcc 的编译流程 和gdb的调试方法

    GCC的编译流程分为四个步骤: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 可以看的出来文件大小 gdb 调试 gdb - ...

  6. abandon, abbreviation

    abandon 近/反义词: continue, depart, desert (做动词时读作diˈzəːt), discard, give up, quit, surrender搭配: altoge ...

  7. Hive(七)【内置函数】

    目录 一.系统内置函数 1.查看系统自带内置函数 2.查看函数的具体用法 二.常用内置函数 1.数学函数 round 2.字符函数 split concat concat_ws lower,upper ...

  8. Angular中@Output()的使用方法

    子component中的html文件 <button (click)="Send()">送出</button><br> 子component中的 ...

  9. Java 性能优化的 50 个细节

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. #尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间, ...

  10. Linux学习 - 数值运算

    1 declare 声明变量类型 declare [+/-] [选项] 变量名 - 给变量设定类型属性 + 取消变量的类型属性 -i 将变量声明为整数型 -x 将变量声明为环境变量(同export) ...