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本身 ...
随机推荐
- LeetCode刷题总结-递归篇
递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?).因此,本文将选择Lee ...
- Bootstrap应用核心
Bootstrap是当前世界最受欢迎的响应式.移动设备优先的门户和应用前端框架.它不是单一的CSS或JavaScript框架,而是完整的HTML.CSS.JavaScript框架,你可以仅通过Boot ...
- Java并发入门之FutureTask
Java并发入门之FutureTask 前言: 最近遇到一个项目需要上传图片到服务器,API要求是二进制流,那就跑慢点一点点上传. 于是对多线程从没有应用过的我,决定拿多线程直接应用于代码. 应用Ex ...
- 函数进阶(二) day13
目录 昨日内容 闭包函数 装饰器 二层装饰器 装饰器模板 三层装饰器 今日内容 迭代器 可迭代对象 迭代器对象 for循环原理(迭代循环) 三元表达式 列表推导式 字典生成式 生成器 yield关键字 ...
- day08整理(周总结\列表\字典内置方法)
一.周总结 一 计算机基础之编程 1.什么是编程语言 编程是人与计算机交流的介质 2.什么是编程 通过编程语言写一堆文件 3,为什么编程 取代劳动力,帮人类干活 二 计算机组成 1.CPU 控制器 控 ...
- 设计模式(一)Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...
- video1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- mysql获取刚插入(添加)记录的自动编号id
我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但在多线程情况下,就不行了. 下面介 ...
- srync:@ERROR: auth failed on module tee 的解决办法分析
首先:检查server端和client端的用户名和密码确认都无误: 然后:检查了服务器端/etc/rsyncd.conf 配置文件未发现异常, 再次:通过配置文件找到了log存放目录 $ cat /e ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理. 本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集 ...