【注】本文不是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. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

  2. C++匿名函数的使用

    c++匿名函数使用方法 1.匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数列表)->返回类型{函数体} int main() { auto Add = [](int a, int ...

  3. C++ and OO Num. Comp. Sci. Eng. - Part 2.

    本文参考自<C++ and Object-Oriented Numeric Computing for Scientists and Engineers>. 1. Basic Types ...

  4. Oracle、MySQL关机操作步骤

    一.Oracle数据库单机关机(eg:LEAP系统) 先关闭使用数据库的应用系统,再关闭数据库 关闭数据库执行以下命令 1.关闭Oracle数据库监听器:(使用操作系统下管理Oracle的账户,关闭监 ...

  5. java面试题目偏基础

    一.JAVA基础篇-概念1.简述你所知道的Linux:Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(An ...

  6. LeetCode 从头到尾打印链表

    LeetCode 从头到尾打印链表 题目描述 输入一个链表头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 一得之见(Jav ...

  7. A Child's History of England.46

    As, one hundred years before, the servile [卑躬屈膝的~serve] followers of the Court had abandoned the Con ...

  8. Spark(九)【RDD的分区和自定义Partitioner】

    目录 spark的分区 一. Hash分区 二. Ranger分区 三. 自定义Partitioner 案例 spark的分区 ​ Spark目前支持Hash分区和Range分区,用户也可以自定义分区 ...

  9. 【leetcode】36. Valid Sudoku(判断能否是合法的数独puzzle)

    Share Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated accordi ...

  10. E面波导和H面波导的问题

    我感觉与窄壁平行是E面,反之为H面.通常E面(窄面)是指与电场方向平行的方向图切面(窄面):H面(宽面)是指与磁场方向平行的方向图切面(宽面).E面的意思是... ElevationH面的意思是... ...