【注】本文不是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. centos与ubuntu安装及相关问题解答

    1.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. 答:Linus的发行版本有slackware,debian,redhat,Alpine,ArchLinux,Gentoo,LFS, ...

  2. CF1036F

    考虑这种一堆数字\(gcd = k\) 有经典做法. 考虑设\(f(x)\)为\(gcd\)是\(x\)的倍数的方案数. \(g(x)\)为\(gcd\)刚好为\(x\)的方案数. 则有 \(f(x) ...

  3. Codeforces 724G - Xor-matic Number of the Graph(线性基)

    Codeforces 题目传送门 & 洛谷题目传送门 一道还算不套路的线性基罢-- 首先由于图不连通,并且不同连通块之间的点显然不可能产生贡献,因此考虑对每个连通块单独计算贡献.按照 P415 ...

  4. 【2020五校联考NOIP #8】自闭

    题目传送门 题意: 有一个 \(n \times m\) 的矩阵,里面已经填好了 \(k\) 个非负整数. 问是否能在其它 \(n \times m-k\) 个格子里各填上一个非负整数,使得得到的矩阵 ...

  5. Codeforces 1097G - Vladislav and a Great Legend(第二类斯特林数+树上背包)

    Codeforces 题目传送门 & 洛谷题目传送门 首先看到这题我的第一反应是:这题跟这题长得好像,不管三七二十一先把 \(k\) 次方展开成斯特林数的形式,\(f(X)^k=\sum\li ...

  6. ggplot2 颜色渐变(离散颜色)设置

    一.示例数据准备 数据格式如下: 二.作图 1.直接作图结果如下,默认蓝色渐变. 1 ggplot(df,aes(x=BP_A,y=P.value,colour=R2))+ 2 geom_point( ...

  7. 使用systemd将iptables规则在docker启动后自动导入

    编写systemd文件 $ sudo vi /etc/systemd/system/iptables-import.service # /etc/systemd/system/iptables-imp ...

  8. 【风控算法】一、变量分箱、WOE和IV值计算

    一.变量分箱 变量分箱常见于逻辑回归评分卡的制作中,在入模前,需要对原始变量值通过分箱映射成woe值.举例来说,如"年龄"这一变量,我们需要找到合适的切分点,将连续的年龄打散到不同 ...

  9. Angular 组件通信的三种方式

    我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...

  10. Git配置文件与git config命令

    在Git配置文件中配置变量,可以控制Git的外观和操作的各个方面.通过git config命令可以获得和设置配置变量. 一.Git配置文件的位置 这些变量可以被存储在三个不同的位置: 1./etc/g ...