【注】本文不是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. 虚拟机Centos7安装Socks5作为代理服务器

    虚拟机Centos7安装Socks5作为代理服务器 1. 什么是代理服务器 代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到 ...

  2. ansible-playbook 编译安装nginx

    mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,default,meta} -pv └── nginx ├── ...

  3. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...

  4. LeetCode替换空格

    LeetCode 替换空格 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 实例 1: 输入:s = "We are happy." 输 ...

  5. 学习Vue源码前的几项必要储备(一)

    从接下来的一段时间里,Mg要进行阅读源码的工作.再阅读源码前,梳理一下准备工作. 7项重要储备 Flow 基本语法 发布/订阅模式 ES6+ 语法 原型链.闭包 函数柯里化 event loop 1. ...

  6. Oracle数据库导入与导出方法简述

    说明: 1.数据库数据导入导出方法有多种,可以通过exp/imp命令导入导出,也可以用第三方工具导出,如:PLSQL 2.如果熟悉命令,建议用exp/imp命令导入导出,避免第三方工具版本差异引起的问 ...

  7. Lock锁的使用

    在Java多线程中,可以使用synchronized关键字实现线程之间的同步互斥,在jdk1.5后新增的ReentrantLock类同样可达到此效果,且在使用上比synchronized更加灵活. 观 ...

  8. Can we access global variable if there is a local variable with same name?

    In C, we cannot access a global variable if we have a local variable with same name, but it is possi ...

  9. clickhouse客户端使用

    测试初始化 clickhouse-client -m create database if not exists test; use test; drop table test; create tab ...

  10. 浅谈iptables与firewalld防火墙

    iptables基于包过滤的防火墙工具 ,Linux 内核集成的 IP 信息包过滤系统,对流入和流出服务器的数据包进行精细管理 规则是存储在专用信息包过滤表中 防火墙按照规则做出判断 而netfilt ...