自由链表(free list)——SGI STL的空间配置器(allocator)第二级配置器维护方法

2023-05-16

参考:《STL源码剖析》 以及 STL空间配置器之第二级配置器的free-list详解

/*free list的节点*/
union obj{
	union obj * free_list_link; // 第一字段
	char client_data[1];  // 第二字段
};

/*16个free list的头指针存放于数组free_list[]*/
static obj * volatile free_list[16];

(1)链表头指针数组free_list[ ]

  自由链表free list包含了16个链表,每个链表都是由大小为x bytes的内存区块连接。x分别表示8、16、24、…112、120、128。而16个链表的头指针保存在数组free_list[ ]中。数组free_list[ ]的每个元素均为指向节点的指针。比如free_list[11]所指向的链表是由多个大小均为96bytes的内存区块组成。
  各种大小为x的内存区块在还没有被allocat出去用于保存数据时,它们都以链表的形式串联在一起。当调用allocat()方法被分配出去后,就从这个链表中去除了。因此16个链表中串起来的各个内存区块都是空闲的,一旦需要被使用,就会从链表中离开。

(2)free list 节点 obj

  每个自由链表都是由若干个大小相同的内存区块串联而成,而每个内存区块的开头部分都被一个union占据。union类似于struct,但其中的变量所占空间是重叠的,从不同的变量角度看就会被解释为不同含义。这里的union名字为obj,其中的两个变量free_list_link与client_data[ ]占据着同一块大小为4byte的内存空间,client_data[ ]指向头1byte。这4byte内存空间,从free_list_link的角度看,就被解释为free_list_link的值;从client_data[ ]的角度看,就被解释为client_data[0]的值。每个内存区块的开头4byte都归这个obj所有。
  这里定义char client_data[1]的做法其实非常巧妙。在一块内存的开头位置定义一个数组client_data[ ],那么数组名client_data相当于指向这块区域首地址的一个常指针。而这个数组所存的内容client_data[0]其实不会被用到。整块内存区域在使用时都会被数据覆盖,而数组名client_data仍旧指向这块内存区域。因此既能将client_data当做一个存储该内存空间的指针变量,又不需要为这个指针变量分配空间来保存这个地址值从而节约了内存空间。
  free_list_link是一个指向obj的指针变量。当该内存区块空闲时,free_list_link指向下一个相同大小的内存区块,这4byte保存地址信息。而数组名client_data则指向当前内存区块。当该内存区块被用于保存数据而离开自由链表free list时,这4byte空间就被数据所覆盖。而此时由于离开了链表,也就无需指向下一个内存区块了。
  这里再啰嗦地总结一下:每个内存区块的头4byte在区块空闲时保存指针变量free_list_link的值,指向下一个区块串联起链表;而在用于保存数据时,这4byte被数据的一部分所覆盖。而数组client_data[ ]始终作为一个“并不占据内存的常指针”存在,只是形式上将头1byte划分给它,但它并不使用,它也无所谓这1byte内存里存的是什么。

(3)内存池管理函数chunk_alloc()

  内存池管理函数chunk_alloc(size_t size , int& nobjs)每次都从一个完整的内存区域中从顶部划出一整块连续的区域。这块区域小于等于所求的size*nobjs bytes。返回值为该内存区域的首地址。划分的方法简单来说就是将start_free指针返回,然后移动start_free到新的位置。
  不需要担心内存池出现碎片。一般来说,内存池从顶部划给free list的空间并不考虑收回来,当内存池中没有剩余空间时会重新malloc一块空间,带着整个内存池转移阵地。而只有整个heap空间都没有剩余空间时,内存池才会回收free list中整块连续的空闲区域。
  内存池并不负责free那些malloc获得的内存空间。
在这里插入图片描述

(4)自由链表重新填充函数refill()

  当16个链表中某一个链表串起来的内存区块都被用完时,其在数组free_list[ ]保存的头指针将变为0,即不指向任何内存空间。此时就需要重新串起一个链表。
  调用函数refill(size_t n)可以串起一个空闲的链表,将头指针保存在数组free_list[ ]对应位置,并返回一个内存区块以供保存数据使用(这个内存块不会进入链表而是直接被使用,只有调用deallocate()时才会回归链表)。
在这里插入图片描述

  指针变量chunk为内存池管理函数chunk_alloc()返回的整块内存空间首地址。函数refill()负责把这块内存划分成一个一个区块,将第一个区块返回给客端保存数据,剩下的区块进行串联后将头指针保存在数组free_list[ ]对应位置。

(5)空间配置函数allocate()

  当所求空间大于free list管理的最大区块128bytes时,调用第一级配置器直接分配内存空间。
  当所求空间小于128bytes时,将所求区块大小上调至8倍数边界。选择合适的一个链表,从其头部取一个区块出来保存数据,而将其后续区块的地址作为链表的新头指针保存到数组free_list[ ]对应位置。
  取出区块后,该区块的头4byte所保存的地址信息就被数据所覆盖。
在这里插入图片描述

(6)空间释放函数deallocate()

  释放的空间大于128bytes时,调用第一级配置器直接释放。
  空间小于128bytes时,该区块是之前从free list中分配出去的,大小是8的倍数。因此找到对应的链表,将该区块插至头部,并与后序区块串联。将自己的地址作为链表的新头指针保存到数组free_list[ ]对应位置。
  归还区块后,该区块的头4byte重新作为指针变量free_list_link保存后续区块的地址。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自由链表(free list)——SGI STL的空间配置器(allocator)第二级配置器维护方法 的相关文章

  • 尚硅谷大数据技术Spark教程-笔记05【SparkCore(核心编程,累加器、广播变量)】

    视频地址 xff1a 尚硅谷大数据Spark教程从入门到精通 哔哩哔哩 bilibili 尚硅谷大数据技术Spark教程 笔记01 SparkCore xff08 概述 快速上手 运行环境 运行架构 xff09 尚硅谷大数据技术Spark教
  • 尚硅谷大数据技术Spark教程-笔记06【SparkCore(案例实操,电商网站)】

    视频地址 xff1a 尚硅谷大数据Spark教程从入门到精通 哔哩哔哩 bilibili 尚硅谷大数据技术Spark教程 笔记01 SparkCore xff08 概述 快速上手 运行环境 运行架构 xff09 尚硅谷大数据技术Spark教
  • SparkSql简单案例【Dataset,读取数据、创建表、查询数据】

    beer reviews csv package bigdata beer 导入必要的库和类 import org apache spark SparkConf import org apache spark SparkContext im
  • [Linux] Ubuntu配置安装总结

    每次重装新的Ubuntu后 xff0c 都需要配置安装多个应用 xff0c 这里对一些配置进行下总结 以下安装都是在Ubuntu 16 04上进行的 1 Ubuntu安装Google拼音输入法 之前一直使用搜狗拼音 xff0c 但老是崩 x
  • 尚硅谷大数据技术NiFi教程-笔记01【NiFi(基本概念、安装、使用)】

    视频地址 xff1a 尚硅谷大数据NiFi教程 xff08 从部署到开发 xff09 哔哩哔哩 bilibili 尚硅谷大数据技术NiFi教程 笔记01 NiFi xff08 基本概念 安装 使用 xff09 尚硅谷大数据技术NiFi教程
  • 大数据开会记录【NiFi数据集成、AllData数据中台管理系统、RuoYi】

    今天上午和下午开了个小会 xff0c 上午说了一下Nifi xff0c 下午具体说了一下nifi和ruoyi 目录 上午 下午 上午 三个人开会 上次说的挖掘平台 xff0c 您这边是否有技术人员对nifi比较熟悉 xff0c 并且能够将相
  • 大数据周会-本周学习内容总结012

    开会时间 xff1a 2023 05 07 16 00 线下会议 目录 01 es数据同步至mysql 1 1 在es中插入数据后能够同步到mysql中 1 2 修改与删除es中的数据 02 nifi 2 1 Nifi的单机及分布式集群部署
  • 阅读论文文献工具:Zotero

    zotero是开源的文献管理工具 xff0c 可以方便的收集 xff0c 组织 xff0c 引用 xff0c 和共享文献的工具 由安德鲁 w 梅隆基金会 xff0c 斯隆基金会以及美国博物馆和图书馆服务协会资助开发 zotero xff1a
  • Windows11安装docker

    docker官方网站 xff1a Docker Accelerated Containerized Application Development Win11下安装docker win11安装dockerwindow11安装docker小白
  • 光照强度传感器BH1750

    一 芯片介绍 BH1750FVI是一款数字型光强度传感器集成芯片 BH1750的内部由光敏二极管 运算放大器 ADC采集 晶振等组成 结构图 PD二极管通过光生伏特效应将输入光信号转换成电信号 xff0c 经运算放大电路放大后 xff0c
  • VSCode 安装教程(超详细)

    文章目录 VSCode 安装使用教程 xff08 图文版 xff09 那么 xff0c 什么是 IDE 呢 xff1f 目前 xff0c 前端开发主流的 IDE 有以下 5 个下边我们开始玩转 VSCodeVSCode 下载 安装Windo
  • 没有为字符串添加终止符;初始化为‘\0‘

    使用VS2019遇到问题 1 没有为字符串添加终止符 19条消息 消除VS中C6054 可能没有为字符串 34 XXX 34 添加字符串零终止符的警告 wowpH的博客 CSDN博客 可能没有为字符串添加零终止符 2 char a 10 6
  • 安装vue-element-admin报错git clone --mirror -q git://github.com/adobe-webplatform/eve.git C:\Users\Admin

    问题描述 vue element admin项目 执行安装操作时 xff1a 安装依赖 npm install 建议不要直接使用cnpm安装依赖 xff0c 会出现bug xff0c 可以通过如下操作解决npm下载速度慢的问题 由于淘宝 N
  • 添加启动页

    添加启动页 2021 5 7 实验内容 1 为学号后一位同学编写一个简单app 新建一个emptyactivity 在layout的activity main xml中添加如下代码 span class token number 1 spa
  • Python求最大公约数和最小公倍数

    使用辗转相除法求得最大公约数 xff0c 再利用最大公约数求得最小公倍数 辗转相除法求最大公约数 def gcd num1 num2 if num1 num2 61 61 0 return num2 else num1 num2 61 nu
  • matlab实现梯度下降法

    前记 xff1a 大三上学期学了 运筹学 课程 xff0c 里面包含了许多算法和模型 模型就是线性规划及线性规划的对偶理论 xff0c 单纯形法以及它的实际应用 xff1b 整数规划及其解法 xff08 分支定界法 割平面法匈牙利算法 xf
  • 互斥锁、条件变量、信号量浅析

    互斥锁 条件变量 信号量浅析 互斥锁与条件变量 条件变量是为了保证同步 条件变量用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过条件变量告诉别的线程 xff0c 别的线程再进行某些动作 xff08 大家都在semtake的
  • Linux中的tty、pts、pty等概念辨析

    Linux中的tty pts pty等概念辨析 基本概念 tty pty pts ptmx tty xff08 终端设备的统称 xff09 xff1a tty一词源于Teletypes xff0c 或teletypewriters xff0
  • 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案

    树莓派4B aarch64 安装PyTorch 1 8 的可行方案 最终可行方案 试了一堆方案 xff08 源码编译 Fast ai的安装文件等 xff09 之后 xff0c 终于找到一个可行的方案 是在 PyTorch 官方讨论社区的一个
  • Nvidia CUDA初级教程1 CPU体系架构综述

    Nvidia CUDA初级教程1 CPU体系架构综述 视频 xff1a https www bilibili com video BV1kx411m7Fk p 61 2 讲师 xff1a 周斌 本节内容 xff1a 了解现代CPU的架构和性

随机推荐

  • 解决VNC远程连接树莓派,窗口显示不全的问题

    1 vnc连接 xff0c sudo raspi config中7 A5选分辨率就好 或2 通过SSH命令行的方式连接树莓派 xff0c 在命令行输入 xff1a vncserver geometry 1080x1024
  • qt官网下载指导(新手易犯错误)

    一 获取资源 注意这里不要直接百度qt的官网 xff0c 如果直接百度下载会让你注册一个qt的账号 xff0c 并且一般没人下载最新版的qt6 当然也可以下载旧的版本 xff0c 但是由于本人比较愚笨 xff0c 还没有在官网找到qt旧版本
  • AI智能呼叫中心系统,主要应用场景有哪些?

    互联网智能时代 xff0c 销售人员不再每天拨打数百个电话 xff0c 当前呼叫中心电话系统被企业常用在电销行业 金融行业 保险 贷款催收行业等外呼销售行业 由传统的呼叫中心基础上不断的进行升级和改善 xff0c 逐渐演变为人工智能电话外呼
  • ROS:geometry_msgs中 Point32 , Point ,PointStamped 的定义和转换

    ROS geometry msgs中Point32 Point PointStamped 的定义和转换 Point32和Point的定义Point32和Point的转换PointStamped 的定义和转换 本文所用ROS为kinetic版
  • ROS:回调函数不执行

    最近在写一个接收图片消息的节点时 xff0c 遇到了两次回调函数不调用的情况 xff0c 记录一下 循环中有continue被跳过了 具体代码如下 xff1a while ros ok if mat data 61 61 nullptr s
  • Python猜拳游戏

    关键点在于 user input 43 1 3与computer input的值进行比较 xff0c 这样就省掉了对于边界值0和2的单独判断 xff0c 简化了代码 from random import choice def finger
  • ROS:节点发布消息无对应话题名称

    最近在写一个发布里程的节点的时候遇到了 xff0c 发布了消息 xff0c 在ros却没有对应话题情况 通过rostopic list 和 rosnode info 节点名 命令查看 xff0c 均没有对应话题 xff0c 大致代码如下 x
  • 【python安全攻防】python简易端口扫描器

    文章目录 socket套接字optparse模块socket解析主机进行连接获取bannerthreading多线程端口扫描器python nmap端口扫描 对自己看python绝技的一次学习记录 socket套接字 与TCP端口进行交互
  • ROS中geometry_msgs常用消息类型

    官方文档 xff1a geometry msgs Msg Srv Documentation geometry msgs里面所有的消息数据类型 xff1a 节点之间仅支持使用消息通讯 Accel AccelStamped AccelWith
  • 【docker ros】docker 开启自启运行容器中的程序

    前言 xff1a 使用docker大规模部署应用 xff0c 而又需要开机自启 xff0c 自动启动容器中的程序 xff0c 这里以docker ros为例子 xff0c 使用systemctl服务 xff0c 结合shell脚本 xff0
  • 网络协议与网络编程(双电脑串口通讯)

    C C 43 43 网络编程 双电脑串口通讯 在阅读本文前 请确保先查看这篇文章 xff0c 学习有关TCP网编与单电脑信息传输实践 文章目录 C C 43 43 网络编程 双电脑串口通讯 1 让两台电脑连接同一个局域网2 查询IP地址3
  • Linux shell的数组详解

    Linux shell的数组详解 前提变量数组数组声明声明索引数组声明关联数组 数组赋值数组引用数组中常用的变量数组中的其它操作 示例 前提 程序是指 指令 43 数据 的组合 指令 xff1a bash脚本中的代码 xff08 函数 调用
  • cannot find trajectory file at ./examples/trajectory.txt

    slam十四讲 3 7显示运动轨迹的程序 trajectory txt文件路径修改 string trajectory file 61 34 examples trajectory txt 34 改为 string trajectory f
  • slam14讲,李代数库Sophus遇到的问题及解决办法

    首先遇到sophus安装问题是在第4章时 xff0c 高博虽然书上说 我们使用带模板的Sophus库 xff0c 但实际的代码使用的是非模板库 高博在git上给的sophus库文件我在make的时候报错 xff0c 找不到解决办法 xff0
  • PX4添加新的msg和topic

    本人也是初次接触PX4固件没几天 xff0c 学习了msg的一些知识后写下这个以供自己以后参考 一 首先在 PX4 Autopilot msg文件夹下新建一个 msg文件 xff1a 这里我添加的是Data link msg msg 在 m
  • 物理机安装LINUX后的网卡配置问题

    基础材料 xff1a CentOS7 物理服务器 背景说明 xff1a 安装完LINUX操作系统的网卡配置让主机连通网络 xff0c 对于系统管理员来说是再常见不过的事情 xff0c 而且基本上也没什么难度 xff0c 但凡做过系统管理员的
  • PX4添加新的库(lib)

    就在前一两天 xff0c PX4源代码更新了 xff0c 固件库的名称从Firmware变成了PX4 Autopilot 一 首先在lib下新建一个文件夹并添加 cpp hpp和CMakeLists txt 其中 cpp和 hpp是自己写的
  • PX4添加新的应用

    研究了四天怎么添加新的应用程序 xff0c 前几天都尝试着添加 cpp文件的应用程序 xff0c 跟着网上的方法都失败了 xff0c 结果今天试着添加一个 c文件的应用程序居然成功了 先把 c的添加方法写一写 xff0c 以后学会了怎么添加
  • PX4应用程序开机自启动

    修改启动脚本 新版本的PX4固件这些rc文件位置为 xff1a PX4 Autopilot ROMFS px4fmu common init d文件夹中 1 以rc为开头的都是飞控的启动脚本的文件 xff0c 通过这些文件决定那些应用程序应
  • 自由链表(free list)——SGI STL的空间配置器(allocator)第二级配置器维护方法

    参考 xff1a STL源码剖析 以及 STL空间配置器之第二级配置器的free list详解 span class token comment free list的节点 span span class token keyword unio