继承上一篇《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. 浅谈微服务架构与.Net Core

    微服务(microservice)这个概念是2012年出现的,2014年3月Martin Fowler在他的个人网站(https://martinfowler.com/articles/microse ...

  2. c无聊编程

    #include<stdio.h> #include<math.h> void fun_1()//绘制余弦直线 { double y; int m, x; ; y >= ...

  3. 基础安全术语科普(三)——RAT

    什么是RAT? RAT 即 Remote Access Tools (远程管理工具或远程访问工具)的缩写.通俗点说就是木马病毒. RAT 分为两部分——客户端 与 服务端. RAT的工作原理? 服务端 ...

  4. 百万年薪python之路 -- socket()模块的用法

    socket()模块的用法: import socket socket.socket(socket_family,socket_type,protocal=0) socket_family 可以是 A ...

  5. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...

  6. PassWord控件

    <StackPanel Margin="> <Label>Text:</Label> <TextBox /> <Label>Pas ...

  7. Redis(九)哨兵:Redis Sentinel

    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的. Redis从2.8开始正式 ...

  8. Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)

    最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...

  9. UART中的硬件流控RTS与CTS

    最近太忙了,没时间写对Ucos-II的移植,先将工作中容易搞错的一个知识点记录下来,关于CTS与RTS的. 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫( ...

  10. element 自定义 el-loading

    前言 虽说,el-loading 自带的loading效果已经满足日常的需求看 但是,美术大大觉得太low  我要我设计的,我不要你觉得我要我觉得 需求 自定义el-loading 正文 从官方需求文 ...