二级空间配置器

2023-11-16

一级空间配置器:https://blog.csdn.net/qq_37964547/article/details/80474316

一、二级空间配置器

在前面文章中我们介绍了一级空间配置器的概念和实现,一级空间配置器的实现相对比较简单,直接封装了malloc()和free()函数,同时增加了处理机制et_malloc_handler() 。 一级空间配置器主要处理大于128字节的大块内存分配问题,当字节数小于128字节,我们就需要用到二级空间配置器进行空间申请;
STL默认是使用二级空间配置器。

1、二级空间配置器的配置方法

(1)如果申请的区块够大,超过128bytes时,就移交给一级配置器处理
(2)当区块小于128时,则以内存池(memory pool)管理,此法又称为次层配置 : 每次配置一大块内存,并维护对应的自由链表(free list)。下次如在需要相同大小的内存需求时,就直接free lists中拔出。如果客户释放了小额区块时,就由配置器回收到free lists中。为了方便管理,SGI第二级配置器会主动将任何小额区块的内存扩充至8的倍数(比如申请20bytes,就会调整至24bytes),并维护8,16,24,32,40,48,56,64,72,80,88,94,104,112,128bytes的对应大小的自由链表。

2、空间配置器结构图

这里写图片描述

3、具体实现过程

为了维护链表,需要额外的指针,为了避免造成另外一种额外的负担,这里采用了一种技术:用union表示链表节点结构:

union OBJ
{
    OBJ* _freeListLink; //指向下一个节点的指针
    char clientData[1]; //* The client sees this. */ 
};

4、void *Allocate(size_t n)函数解析

具体实现思想如下:
内存池有空间:
(1)内存池剩余空间完全满足20个区块的需求量,则直接取出对应大小的空间。
(2)内存池剩余空间不能完全满足20个区块的需求量,但是足够供应一个及一个以上的区块,则取出能够满足条件的区块个数的空间。
(3)内存池剩余空间不能满足一个区块的大小,则首先判断内存池中是否有残余零头内存空间,如果有则进行回收,将其编入free list;然后向heap申请空间,补充内存池。
heap申请空间:
(1)heap空间满足,空间分配成功。
(2)heap空间不足,malloc()调用失败。则搜寻适当的free_ list(适当的是指:尚有未用区块,并且区块足够大),调整以进行释放,将其编入内存池。然后递归调用chunk_alloc函数从内存池取空间供free list。
(3)搜寻free list释放空间也未能解决问题,这时候调用第一级配置器,利用out-of-memory机制尝试解决内存不足问题。如果可以就成功,否则排除bad_alloc异常。
Allocate函数代码:

static void *Allocate(size_t n)
{
    if (n > _MAX_BYTES)
        return MallocAllocTemplate<0>::Allocate(n);
    __TRACE_DEBUG("二级:%d\n", n);
    size_t index = FREELIST_INDEX(n);//找到对应下标位置
    if (NULL == _freeList[index])
    {
        __TRACE_DEBUG("二级:%d桶中没有可用空间,需要内存池补充\n", index);
        return ReFill(ROUND_UP(n)); //为free_list填充空间
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二级空间配置器 的相关文章

  • 混沌电路学习笔记

    历年电赛仪表 信号题 混沌信号产生实验装置 任务 要求 说明 思路 关键字提取 非线性系统的动态方程 蔡氏电路Chua s circuit wiki版本蔡氏电路 LTspice仿真实践 范德坡电路Vanderbilt circuit 考比兹
  • 黑马实战项目瑞吉外卖的总结

    文章目录 一 瑞吉外卖项目总结 1 后端Controller层返回结果统一封装的R对象 2 定义静态资源映射关系 3 配置消息资源转换器 3 1 Reggie项目中遇到的问题 3 2 原理 3 3 解决方案 3 4 示例 4 Mybatis
  • 自定义设置一个屏保程序

    用C语言写一个简单的窗口程序 目的是生成一个可视化的图形窗口 需要用到EasyX库 可在文章末尾的网盘链接中下载 该程序退出需左击鼠标 否则无法退出 include
  • 使用Docker进行模型部署

    文章目录 1 思路 2 实现步骤 2 1 数据 模型准备 2 2 镜像制作 2 3 使用 1 思路 因为多数公司正式集群都不能使用公网环境 对于模型部署比较麻烦 所以想这在公网环境下完成模型调试 然后根据相关环境和参数直接制作一个docke
  • Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前 本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型 并使用标准tensorflow model server来部署深度学习模型预测服务 tensorflow model server主要负
  • 图书管理借阅系统前端Vue-----前端页面展示(需源码私信免费)

    图书管理借阅系统 该篇文章展示前端代码 开发环境配置 Mysql MybatisPlus Springboot Shiro Swagger Element 前端开发环境 node js hbuilder 图书管理借阅前端所含模块的功能 1
  • mqtt报文逐条解析

    文章目录 1 背景说明 2 mqtt报文解析 3 剩余长度计算 4 构建connect报文 5 CONNACK报文示例 6 心跳PING报文 7 心跳回应PINGRESP报文 8 断开连接DISCONNECT报文 9 订阅请求SUBSCRI
  • UDP实现点对点聊天(多线程)-C语言

    UDP实现点对点聊天 多线程 服务器端 操作步骤 1 编译 gcc UDPM c lws2 32 lmycon lwinmm o UDPM exe 2 运行 UDPM include
  • UDP实现点对点聊天-C语言

    UDP实现点对点聊天 服务器端 操作步骤 1 编译 gcc UDPSt c lws2 32 o UDPSt exe 2 运行 UDPSt include
  • jpg解码库移植过程详解

    1 jpg解码库的源码获取 1 可以从网站下载 http www photopost com jpegsrc v6b tar gz 2 我下面的移植过程是根据jpegsrc v6b tar gz版本的jpg解码库移植的 如果是其他版本的jp
  • 【Python小项目】-名片管理系统

    1 打印的功能页面 print 10 print 名片管理系统 V0 1 print 1 添加一个新的名片 print 2 删除一个名片 print 3 修改一个名片 print 4 查询一个名片 print 5 退出系统 print 10
  • 了解实现一个高并发的内存池——TLS Memmory Pool

    为什么需要内存池 1 效率问题 如果我们直接向系统申请内存 当我们需要频繁的申请释放内存时 就需要频繁的与系统层产生交互 多次切换用户态和内核态 而用户态和内核态之间的切换的消耗是非常大的 因此申请内存的消耗就会很大 程序效率也就随之降低了
  • Java网络编程五子棋,具有玩家转态,登陆界面,多人房间对战,悔棋,求和,认输,聊天室,自动判断输赢等功能。

    小马猿花了一个月的时间终于完成了一个完整的联机版的五子棋游戏 本次代码共可分为 登陆的界面 基于 TPC 的网络连接 五子棋 游戏 共三个部分 如下 1 玩家行为类 2 游戏界面 由于小马猿只有一台电脑 所以用了一台电脑展示了两位玩家的界面
  • 图书管理系统2.0——mysql数据库

    目录 一 简要介绍 1 使用技术 2 简要功能 3 源码 二 需求文档 1 登录 2 注册 3 用户菜单 3 1 借阅图书 3 1 归还图书 3 2 个人中心 3 2 1 查看所有借阅记录 3 2 2 查看借阅中的图书 3 2 3 签到领积
  • c++ 实现贪吃蛇(含技术难点解析和完整代码)

    文章目录 0 参考资料 1 技术难点 1 1 关于光标的移动 1 2 关于蛇的移动 1 2 1 从键盘上读取输入 1 2 2 蛇的移动 1 3 食物的生成 2 完整代码 0 参考资料 借鉴了这位大佬的博客及代码 在其基础上进行了修改 特此鸣
  • 二级空间配置器

    一级空间配置器 https blog csdn net qq 37964547 article details 80474316 一 二级空间配置器 在前面文章中我们介绍了一级空间配置器的概念和实现 一级空间配置器的实现相对比较简单 直接封
  • VUE 富文本 wangEditor v4版本 增加源码模式 与 Monaco Editor结合使用

    VUE 富文本 找了好多开源库 发现 wangEditor Github的星最多 应该也是值得信赖的 但是在使用过程中发现wangEditor 没有源码模式 文档也说明需要自己对接 wangEditor官方文档 于是自己写了一个与 Mona
  • png格式解码库移植过程详解

    1 zlib库和png库的源码获取 1 zlib库源码下载网址 http www zlib net 2 libpng库源码下载网址 ftp ftp simplesystems org pub libpng png src libpng16
  • 傻瓜电梯项目实现

    目录 文档介绍 package lift entity Elevator java Entity java Floor java package lift Pretreatment Pretreatment java package lif
  • 从零开始用C语言实现图片解码播放器(有源码)

    1 项目描述 1 1 项目硬件平台介绍 1 硬件平台 九鼎公司的X210开发板 S5PV210 Cortex A8内核 2 软件平台 linux2 6 35 7内核 直接基于linux API操作 1 2 项目功能介绍 1 调用编译好的可执

随机推荐

  • 传奇GOM引擎合区工具源码

    传奇GOM引擎合区工具源码 自己写的一点小项目 所以在此给大家分享 包含MFC框架 Windows消息机制原理 WIN32API调用 还有找了半天的后台组合按键消息 合区功能基本都有 是学习MFC的一个好的小项目 VS2013 unicod
  • python中dataframe将一列中的数值拆分成多个列

    起初的数据是这样的 想将page no这一列拆分成多个列 然后将其中的值都作为列名 想要做成的结果如下图 也就是统计每个id下各个page no出现的次数 实现的思路是先对page no这一列进行one hot编码 将一列变为多列 然后再用
  • mybatis-plus3.5.2分页插件无效解决方案

    解决问题思路 测试分页插件的时候发现sql语句没有添加limit并返回的是所有数据 排查得知mybatis plus版本为3 5 2 搜索资料得知旧版本的PaginationInterceptor已经过时 官方推荐使用PaginationI
  • Python基本语法,python入门到精通

    python你不去认识它 可能没什么 一旦你认识了它 你就会爱上它 Python基本语法 1 定义变量 代码正文 x 1 y 2 z x y Python定义变量的方式呢很简单 就是上面这段代码 相信只要稍微懂点数学的人都能看懂这段代码的含
  • 微信终于支持 H5 跳转 App &小程序

    继小程序灰度测试分享朋友圈刷屏后 滴滴滴 这 闲着也闲着 顺藤摸瓜点了进去 好家伙 产品小姐姐写这个文案还是太含蓄了 我猜有可能是老干妈还没吃够 根据刀哥多年写代码要看文档的经验来看 证实了这次更新不仅支持了打开小程序 连app也顺带支持了
  • 第17节-PhotoShop基础课程-画笔修复工具

    文章目录 前言 1 画笔工具 1 基本操作 2 工具选项 1 不透明度 2 流量 3 平滑 2 画笔大小工具栏大小设置 4 笔刷 2 铅笔工具 3 颜色替换工具 批量替换颜色 4 混合器画笔工具 人像精修 前言 画笔工具的使用 1 画笔工具
  • BottomSheetDialogFragment圆角

    自己使用BottomSheetDialogFragment时 想实现上方圆角 布局设置了圆角的背景后 需要给dialog的北京设置为透明 才能有圆角的效果 网上其他的文章都是这么实现的 dialog getWindow findViewBy
  • 小程序发布上线全流程(包含小程序怎么通过审核)

    小程序在开发完成后 需要上传代码 设为体验版本 功能测试 提交审核 发布上线这几个基本步骤 接下来用自己的亲身经历一一详细介绍 小程序发布上线全流程 1 上传代码 在微信开发者工具的右上角上传处上传全部代码 如下图 如果小程序中涉及到一些r
  • 程序kill后仍占用GPU

    sc yolov5 zqchen gpurtx02 ultralytics gpustat gpurtx02 Thu Aug 24 09 18 31 2023 470 74 0 Quadro RTX 6000 41 C 0 0 24220
  • 2-需求分析

    一 需求收集 1 需求概念 以下常见三种情形 提问题 目的不明确 明确困境 提目的 目的明确 解决方案不明确 提方案 目的明确 方案明确 概念 本质是用户的预期和现状之间的差异产生的需求 在提出需求时 往往会基于目的描述问题 想法或建议 往
  • python代码~考研祝福

    完整代码如下所示 from turtle import speed 2 Turtle screen delay 0 def go to x y up goto x y down def ring a b c d for i in range
  • STM32F103小容量、中容量和大容量单片机介绍

    一 小容量 中容量和大容量表示的型号 STM32F103x4和STM32F103x6被归为小容量产品 闪存小于等于32K STM32F103x8和STM32F103xB被归为中等容量产品 闪存小于等于128K STM32F103xC STM
  • diskgenius创建efi分区_怎么创建efi系统分区?efi系统分区创建教程

    文章导读 近两年出来的的电脑不管是新台式机还是笔记本电脑 绝大多数是uefi主板 要采用对应的硬盘分区是gpt格式的 所以我们一定要记得采用efi引导对应的分区类型一定是gpt分区 EFI分区是GPT磁盘分区表里面的一个必要分区 是独立于系
  • win10上安装python3.9.0+robotframework

    win10上安装python3 9 robotframework python3 9 0下载安装 robotframework安装 wxpython安装 ride安装 python3 9 0下载安装 下载地址 python3 9 0下载地址
  • 【机器实战学习】朴素贝叶斯 python代码实现

    朴素贝叶斯 输入数据创造词汇表 代码实现 coding UTF 8 def loadDataSet 创建了一下实验样本 return 词条且分的文档集合 类别标签的集合 自动检测侮辱性的语言 postingList my dog has f
  • 23种设计模式:适配器模式(最强解析!!!)

    适配器模式是23种设计模式之一 适配器模式作用 适配器模式的作用 在于将一个类的接口变换为客户端所期待的另一种接口 使得原本因为接口不匹配而无法一起工作的两个类能在一起工作 也就是说 适配器模式解决的是接口兼容性问题 适配器模式实现方式 适
  • 深度学习(十四):详解Matconvnet使用imagenet模型训练自己的数据集

    上节讨论过如何使一个简单的cnn网络训练mnist数据集 该节介绍复杂并且使用广泛的使用imagenet网络的预训练模型训练自己的数据集 Ok首先是自己的数据集了 Matconvnet中训练imagenet的数据集的准备不像caffe这些工
  • 【原创】【硬件电路】N沟道、P沟道MOS管基本原理与应用案例

    文章首发于同名微信公众号 DigCore 欢迎关注同名微信公众号 DigCore 及时获取最新技术博文 一 N MOS管和P MOS管的对比 二 N MOS的开关条件 N MOS管的导通调节是G极与S极中间的电压差超过阈值时 D极和S极导通
  • C语言中printf("lld")和printf("I64d")

    C语言中printf lld 和printf I64d 是不同的 这个是因为编译器的不同导致的 所以广大的ACMer需要注意了 HDU OJ 4504就是这样的一个问题 下面是Dp和math方法的AC代码 但是换成lld全都Wrong An
  • 二级空间配置器

    一级空间配置器 https blog csdn net qq 37964547 article details 80474316 一 二级空间配置器 在前面文章中我们介绍了一级空间配置器的概念和实现 一级空间配置器的实现相对比较简单 直接封