Boost Asio要点概述(一)
【注】本文不是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要点概述(一)的更多相关文章
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- c++ boost asio库初学习
前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...
- 如何在多线程leader-follower模式下正确的使用boost::asio。
#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...
- BOOST.Asio——Tutorial
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- boost asio sync
Service: #include<boost/asio.hpp> #include<boost/thread.hpp> #include<iostream> #i ...
- 网络库crash以及boost asio strand dispath分析
最近在做服务器的稳定性的相关测试,服务器的网络底层使用的是boost asio,然后自己做的二次封装以更好的满足需求. 服务器昨天晚上发现crash了一次,之前测试了将近半个多月,有一次是莫名的退出了 ...
- boost asio tcp server 拆分
从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...
- boost::asio 使用实例
#include <iostream> #include <boost/asio.hpp> using namespace std; using namespace boost ...
- boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)
* Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...
随机推荐
- Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)
题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...
- 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)
洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\) \(10^9\) 的时代了吗?落伍了落伍了/ ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- [Linux]非root的R环境被conda破坏后如何恢复?
记录说明 这篇文章本来是用来记录Linux非root环境下安装PMCMRplus包折腾过程,但后来试过了各种方法安装不上这个R包后,我换上了Miniconda来安装.经前人提醒,一开始安装Minico ...
- [Linux] 非root安装GCC9.1.0
说明 一般Linux系统自带或公共的GCC版本都很低,如目前我们的服务器版本的GCC还停留在gcc-4.9.3,而官网已到达9.2版本(下载http://ftp.gnu.org/gnu/gcc/) , ...
- Nginx 编译 echo 模块
Nginx 编译 echo 模块 echo模块下载地址:https://github.com/openresty/echo-nginx-module 查看nginx已经编译的模块, nginx -V ...
- python-django-分页处理
每个模型都有一个管理器,Manager 通过分页可以先加载一部分的数据内容,然后避免大量的查询带来的等待时间 应用场景是,排行榜,前十条或者 for i in range(100): ...: ... ...
- xshell的快捷复制粘贴设置
今天试着用xshell连接Linux,运行一些命令的时候想快点复制粘贴实现效率,却发现还要右键选择复制,再右键选择粘贴,很是麻烦. 看了一下xshell的设置,其实可以自己设置成快捷方式 以xshel ...
- 【玩具】获取B站视频的音频片段
事情是这样的,我有个和社畜的社会地位不太相符的小爱好--听音乐剧. 基本上是在B站上点开视频听,不是不想在网易云或者QQ音乐听,只是在这些音乐软件上面,我想听的片段要不就收费,要不版本不是我喜欢的,要 ...
- 百页 PPT BPF 技术全览 - 深入浅出 BPF 技术
eBPF 从创建开始,短短数年(7年),至今就已经被认为是过去 50 年来操作系统最大的变更,那么 eBPF 技术到底给我们带来了什么样的超能力,以至于得到如此高的评价? 本文从以下内容入手,对 eB ...