ACE框架 基于共享内存的分配器 (算法设计)
继承上一篇《ACE框架 基于共享内存的分配器设计》,本篇分析算法部分的设计。
ACE_Malloc_T模板定义了这样一个分配器组件

分配器组件聚合了三个功能组件:同步组件ACE_LOCK,内存块管理算法组件ACE_CB, 以及内存底层服务组件ACE_MEM_POOL_1。
内存底层服务组件ACE_MEM_POOL_1只提供向系统申请内存,并不参与分配器块管理。
分配器定义了4个功能核心算法的函数,分别是shared_malloc和shared_free(提供块分配管理),以及shared_find和shared_bind(提供命名发布)。这4个核心算法依赖算法组件ACE_CB。这个依赖并不是接口方式的依赖,而是结构上强偶合的依赖。ACE_CB组件必须实现算法中使用到的结构成员,并且理解算法中结构成员之间的关系。
ACE_CB必须提供块头结构定义,以及一个空闲链表和一个名称服务管理链表。
分配器核算法shared_malloct和shared_free维护空闲链表,而shared_find和shared_bind维护名称服务管理链表。
为什么ACE_CB是结构上的强偶合依赖,而不是接口上依赖。因为ACE_CB组件上的资源必须储存在由ACE_MEM_POOL_1组件分配的某种性质的内存上。
一:下面来看分配器为我们提供了如何块分配管理算法。
1. 块必须有一个块头可以进行链表维护,块的向下cast到用户的使用区返回给用户使用,分配器可以通过块的用户使用区upcast到块头,从而进行块的维护。
2. 块分配按块头的尺寸的整数倍进行拆分,块头必须对齐一定的字长倍数。这样在分配和释放管理中,有利于进行拆分和合并。因此在ACE_CB组件提供的块头定义中,块头使用的size_成员,它的计量单位并不是byte,而是块头尺寸的倍数。另外,在分配时,用户申请的大小都会被对齐这个倍数,所以通常会返回一个rounded_bytes。
3. 空闲链表按地址升序链接所有空闲块,空闲块被分配后其块头的next_block_成员必须指向自身,因为在共享内存的分配器中,分配出去的块必须通过使用ACE_Based_Pointer的next_block_指明本身的偏移量,在释放时可以被不同进程重新获知块所在共享内存空间的位置。
4. 当空闲链表上的空闲块不能满足用户的分配要求时,向ACE_MEM_POOL_1组件索取整体的大块。
5. 每次分配都遍历升序的空闲链表,找满足(不小于)用户分配要求的第一个空闲块进行拆分。在拆分时,从块的底部开始进行分裂,这样可以避免一次脱链和重新链入。

6. 每次释放时都遍历升序的空闲链表,按升序找插入位置,在插入时要考虑将相粼的块进行合并。

分配算法并不提供堆的方式进行管理,当用户要求分配的小块时,尽管空闲链表中有最接近要求的空闲块,也会因为空闲块的地址顺序而从小地址的大块中进行拆分。可以预想到在使用这个分配器进行频繁的小块分配和释放,即应用在频繁的短期小块使用的场合中,是不利的。
二:ACE_PI_Control_Block初始化算法。
1. 相同路径的分配器的ACE_PI_Control_Block只可以进行一次初始化,这是ACE_MMAP_Memory_Pool帮助决定的。ACE_MMAP_Memory_Pool在进行内存映射时可以通过创建映射的失败来判断,分配器已经进行过初始化打开。
2. ACE_PI_Control_Block必须固定在ACE_MMAP_Memory_Pool映射内存的开始位置。
3. 空闲块链表是一个环链表,必须为其指定一个链表头。
ACE框架 基于共享内存的分配器 (算法设计)的更多相关文章
- ACE框架 基于共享内存的分配器
ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...
- ACE框架 基于共享内存的进程间通讯
ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...
- (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF
一.前言 进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道.Socket.消息.本地文件.共享内存等,每种方式都有各自适应的场景. 在进行大数据交换时,最优的方式便是共享内存. ...
- Unix IPC之基于共享内存的计数器
目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...
- 撸代码--linux进程通信(基于共享内存)
1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候 ...
- 基于共享内存、信号、命名管道和Select模型实现聊天窗口
问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...
- vector存入共享内存(了解)
昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...
- Qt之进程间通信(共享内存)
简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...
- Linux进程间通信—共享内存
五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...
随机推荐
- go-linux环境搭建
下载 go1..linux-amd64.tar.gz 解压: tar zxvf go1..linux-amd64.tar.gz -C /usr/local 配置环境变量:vim /root/.bas ...
- 推荐几个IT交流社区
博客园,csdn,掘金,StackOverflow(境外),v2ex,开源中国,简书,头条
- 图像处理 - ImageMagick 简单介绍与案例
在客户端我们可以用 PhotoShop 等 GUI 工具处理静态图片或者动态 GIF 图片,不过在服务器端对于 WEB 应用程序要处理图片格式转换,缩放裁剪,翻转扭曲,PDF解析等操作, GUI 软件 ...
- vue系列---响应式原理实现及Observer源码解析(一)
_ 阅读目录 一. 什么是响应式? 二:如何侦测数据的变化? 2.1 Object.defineProperty() 侦测对象属性值变化 2.2 如何侦测数组的索引值的变化 2.3 如何监听数组内容的 ...
- Django之CBV视图源码分析(工作原理)
1.首先我们先在urls.py定义CBV的路由匹配. FBV的路由匹配: 2.然后,在views.py创建一名为MyReg的类: 注意:该类必须继续View类,且方法名必须与请求方式相同(后面会详解) ...
- C++ 大作业资料总结
一般 C++ 大作业都是用 Qt 来写,Qt 本身带了很多例子,详见:https://doc.qt.io/qt-5/qtexamples.html# 如果你想偷懒的话,直接拿来改就好,或者去 Gith ...
- tp5底层源码分析之------tp5.1类的自动加载机制
tp框架作为国内主流框架,目前已经发布了6.0版本,相当于3.*版本是进行了重构,今天我们从源码的角度来研究下tp5.1自动加载的实现 作为单入口框架,从入口文件看起,入口文件在public/下,那么 ...
- Java多线程编程(五)定时器Timer
一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...
- 百度地图Javascript API 调用示例
调用示例 !<!DOCTYPE html> <html> <head> <title>百度地图DEMO</title> </head& ...
- 字符logo存档
在做项目的时候在源码开头加上一个自己的Logo就很爽,配合上标准的许可证声明之类的就可以让自己的代码看上去很专业.逼格很高-- 之前用topster.de的ASCII Generator搞过一点log ...