继承上一篇《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框架 基于共享内存的分配器 (算法设计)的更多相关文章

  1. ACE框架 基于共享内存的分配器

    ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...

  2. ACE框架 基于共享内存的进程间通讯

    ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...

  3. (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF

    一.前言 进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道.Socket.消息.本地文件.共享内存等,每种方式都有各自适应的场景. 在进行大数据交换时,最优的方式便是共享内存. ...

  4. Unix IPC之基于共享内存的计数器

    目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...

  5. 撸代码--linux进程通信(基于共享内存)

    1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候 ...

  6. 基于共享内存、信号、命名管道和Select模型实现聊天窗口

    问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...

  7. vector存入共享内存(了解)

    昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...

  8. Qt之进程间通信(共享内存)

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  9. Linux进程间通信—共享内存

    五.共享内存(shared memory) 共享内存映射为一段可以被其他进程访问的内存.该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中.共享内存是最快的IPC机制,但由于linux本身 ...

随机推荐

  1. 后缀数组(SA)

    学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...

  2. 简易数据分析 13 | Web Scraper 抓取二级页面

    这是简易数据分析系列的第 13 篇文章. 不知不觉,web scraper 系列教程我已经写了 10 篇了,这 10 篇内容,基本上覆盖了 Web Scraper 大部分功能.今天的内容算这个系列的最 ...

  3. git中fatal: Authentication failed的问题

    git中fatal: Authentication failed的问题 有两种办法,一种是删除重新认证,另一种是使用Ssh 删除重新认证 有控制面板->用户账户->管理windows凭据- ...

  4. Python 中文乱码matplotlib乱码 (Windows)

    Python解决matplotlib中文乱码问题(Windows) matplotlib是Python著名的绘图库,默认并不支持中文显示,因此在不经过修改的情况下,无法正确显示中文.本文将介绍如何解决 ...

  5. MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、

    一.索引 所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径.每种存储引擎(MyISAM.InnoDB.BDB.MEMORY等)对每个表至少支持16个索引,总索引长 ...

  6. OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划

    一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...

  7. Win10 连接CentOS 8 的Docker容器中 SqlServer数据库

    楔子 工作在win10环境下,使用Docker Windows桌面版容器化SqlServer数据库连接使用(主要是想用Docker),但是同时需要Linux系统测试,win10 下VMware 虚拟机 ...

  8. 使用Java调用exe可执行文件

    一.出发点 平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装.因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况.那么这时候,我个人需要 ...

  9. Luogu P2668 斗地主(NOIP2015)

    还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...

  10. 【BZOJ4720】【UOJ262】【NOIP2016】换教室

    Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程安排在n个时间段上.在第 i(1≤i≤n)个时间段上,两节内容 ...