boost asio linux原理,BOOST.ASIO源码剖析(二) ---- 架构浅析

news/2025/5/24 3:05:32

架构浅析

先来看一下asio的0层的组件图。

ea2126f5afe1b04e4cd9c68d5d425842.png

(图1.0)

io_object是I/O对象的集合,其中包含大家所熟悉的socket、deadline_timer等对象,主要功能是提供接口给用户使用。

services服务是逻辑功能的实现者,其中包含提供定时功能的deadline_timer_service、提供socket相关功能的win_iocp_socket_service(windows平台)/reactive_socket_service(其他平台)、作为io_service功能的真正实现者win_iocp_io_service(windows平台)/task_io_service(其他平台)等等服务。

"Asio核心组件"在这一层中可以理解为就是io_service,它通过关联的类service_registry将实现具体功能所需的服务组合起来,再由io_object提供接口给用户使用。

这三大组件构成了asio的核心架构,asio的一切都是以此为根基衍生扩展出来的。

让我们将图1.0进一步细化:

0c794db6eb4fdf42dbbb4fc382905271.png

(图1.1)

“Asio核心组件”细化为4个类:io_service,service_registry,service,service_base。其中,service_registry负责管理所有服务,使用延迟创建技术,在真正使用服务对象的时候才创建服务对象,并以单链表的方式管理,但只能增不能删,直到service_registry析构时才会释放其管理的服务对象。service是io_service的类中类,是一个虚基类,所有由service_registry管理的服务都必须从service派生。service_base是service的直接派生类,是services继承体系的第二级,组合了service_id,目前asio中所有服务均继承与service_base。

“I/O对象”细化为basic_io_object及其派生类。basic_io_object是所有I/O对象的基类,提供I/O对象与其对应服务的联系。

再将图1.1进一步细化(关注网络I/O方面的一些类,其他方面的类未画出):

06fedb5525ba5fc8c4e608f606a05388.png

(图1.2)

io_service的真正逻辑实现封装在内部桥接的类io_service_impl中,io_service_impl是一个typedef(在windows平台下是win_iocp_io_service,其他平台下是task_io_service)。io_service_impl就是一个继承于service_base的服务,在io_service初始化也就是其关联类service_registry初始化时被创建,再由io_service持有其引用。

从图中可以看到,继承于service_base的服务有:

strand_service:提供串行化多线程调用的功能

deadline_timer_service:提供定时器功能

stream_socket_service:提供流式socket相关功能

datagram_socket_service:提供报文式socket相关功能

seq_packet_socket_service:提供seq_packet socket相关功能

raw_socket_service:提供原始套接字相关功能

socket_acceptor_service:提供端口监听和接受客户端连接相关功能

这些服务都是幕后英雄,对于用户而言是感知不到的,用户使用的都是其对应的I/O对象。

这些服务对应的I/O对象是:

io_service::strand

basic_deadline_timer

basic_stream_socket

basic_datagram_socket

basic_seq_packet_socket

basic_raw_socket

basic_socket_acceptor

除此之外,asio中还有串口通信、信号处理等功能,在此不再一一赘述。

文章来源:https://blog.csdn.net/weixin_35273106/article/details/116945670
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-16736.html

相关文章

3500个常用汉字表_中考语文常用汉字3500(一)你知道的有多少?

中考语文3500常用汉字七年级上课文篇目 需掌握的字 正确读音 课文篇目 需掌握的字 正确读音为你打开一扇门 憧憬 chōng jǐng 十三岁的际遇 白驹过隙 jū x 裨益 b 蓦然 m 广袤 mo 积攒 zǎn 跌宕 dng 安恬 tin 诠释 qun 樯橹 qing 真谛 d 惆怅 chuchng 繁星 半明半昧 mi 伟人…

Linux异常aborted定位方法,C++异常的几种捕获方式

捕获指定的类型这样的话可以对每种异常做出不同的处理,例如:#include using namespace std;void A(int n){int a 1;float b 0.2;double c 0.3;if(n 1)throw a;else if(n 2)throw b;else if(n 3)throw c;}int main(){int test;while(cin >> t…

python minimize_同义词词向量训练python实现

Boblee人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发前后端、爬虫等。本文基于https://zhuanlan.zhihu.com/p/28979653进行修改。word2vec简要介绍word2vec 是 Google 于 2013 年开源…

InputStream、OutputStream

InputStream(输入流):Read读数据 OutputStream(输出流):Write写数据 字节流用的是字节数组。 Read方法和Write方法的特点: 为什么Read方法返回的是byte类型的字节而是返回int型,是因…

c语言如何获取当前程序时间,c语言程序设计中如何从系统中调出时间

转载C语言的标准库函数包括一系列日期和时间处理函数,它们都在头文件中说明。下面列出了这些函数。在头文件中定义了三种类型:time_t,struct tm和clock_t。在中说明的C语言时间函数time_t time(time_t *timer);double difftime(time_t time1,…

pycharm运行py文件_联邦学习开源框架FATE研究--使用PyCharm开发和调试

上篇简要介绍了FATE在MAC环境下如何快速跑通花京华:联邦学习开源框架FATE研究--MAC环境下的安装和运行​zhuanlan.zhihu.com对于急需上手的开发者来讲,跑通是前提,debug才是根本,没有debug环节,很多代码的运行细节我们…

区间型动态规划 之 CODE[VS] 1154 能量项链 (2006年NOIP全国联赛提高组)

/* 思路同:CODE[VS] 1048 石子归并 dp[i][k] : i到k的珠子,所能获得的最大能量 dp[i][k] max(dp[i][k], dp[i][j] dp[j1][ik] arr[i]*arr[j1]*arr[ik1])注意: 此题为循环“石子归并”,空间开为两倍(将循…

瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗、寻觅、发现,而不屈服。[诗人丁尼生] 上篇中,我们学习了Box2d物理引擎的三大模块之中的一个的collision模块,该模块主要包括形状sh…

c语言搬砖问题while,C语言例题系列-------第五天(示例代码)

//9、搬砖问题:有36块砖&#xff0c;由36人搬&#xff1a;一男搬4块&#xff0c;一女搬3块&#xff0c;两个小孩抬一块。要求一次全部搬完。//问男、女、小孩人数各若干&#xff1f;#includeint main(){int a,b,c;for(a0;a<9;a){for(b0;b<12;b){for(c0;c<72;c2){if(a*…

支持向量机伪代码_2K 星!绝佳的 Python 机器学习在线指南,教程和代码可能更适合你...

点击上方“AI有道”&#xff0c;选择“置顶”公众号重磅干货&#xff0c;第一时间送达本文转载自深度学习专栏&#xff0c;禁二次转载机器学习、深度学习如何更好、更有效率地学习&#xff1f;不外乎两点&#xff1a;一是需要一份较完备的入门路线&#xff1b;二是教程与代码相…