符合Misra C++标准且支持mmap的内存池管理模块

概述

定义内存管理的相关行为。使用了预分配的管理,先分配一块足够大的内存,然后需要时再从这块内存中进行分配。
代码仓库:https://gitee.com/liudegui/mem_pool

类之间的关系

模块名功能
MemPool内存池模块入口,提供常用的模块间交互需要的数据内存池管理
MemAllocDelegate用于内存池中的统一对整块系统内存的申请和释放,有Mem和Default两种申请方式
MemPoolManager对由MemMapMemAllocator申请到的整块大内存,进行小颗粒度的精准分配和释放(这里的申请和释放不是针对系统资源,而是针对内存池中的大块内存而言)
DefaultMemAllocator默认的内存申请方式。使用是std::list<std::vector<int8_t>>申请和管理。
MemMapMemAllocator内存映射方式申请共享内存

MemPool 使用 MemPoolDelegate 来获取一块大的内存,然后使用 MemPoolManager 对这块内存进行关系。
在这里插入图片描述
1、DefaultMemAllocator模块使用C++的STL的std::list<std::vector<int8_t>>申请内存;
原因:符合Misra规范,Misra C和C++都不支持直接使用malloc/new申请内存
2、MemAllocDelegate支持两种内存申请方式的对象,DefaultMemAllocator和MemMapMemAllocator;
3、/dev/mem: /dev/mem是系统物理内存的映像文件;
/dev/zero: 在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。

关键过程

MemPool 创建

  • 首先分配一块的内存,内存大小:unit_count_ + 1*unit_size_ bytes;
  • 然后按照 alignment 进行对齐;
  • 最后创建MemPoolManager manager_ ,在MemPoolManager中,会将创建并初始化空闲位图 in_use_ 和空闲链表next_free_,具体见代码:
MemPoolManager::MemPoolManager(const char *name, void *buffer, unsigned int unit_size, unsigned int unit_count) {
  name_ = strdup(name);
  pool_ = buffer;
  unit_size_ = unit_size;
  unit_count_ = unit_count;
  free_count_ = unit_count_;
  // 创建 use map 和 free list
  in_use_ = reinterpret_cast<bool *>(malloc(unit_count * sizeof(bool)));
  next_free_ = reinterpret_cast<int *>(malloc(unit_count * sizeof(int)));
  // 初始化 use map 和 free list
  for (unsigned int i = 0; i < unit_count; i++) {
    in_use_[i] = false;
    next_free_[i] = i + 1;
  }
  first_free_ = 0;
  last_free_ = unit_count_ - 1;
  next_free_[last_free_] = -1;
}

MemPool alloc

  • 判断请求 size 是否大于 unit_size,若大于则返回 NULL;
  • 判断是否有空闲的 unit, 若没有则返回 NULL;
  • 从 free list 中取出第一个 free unit, 将其标记为 used, 并从 free list 中移除

具体见如下代码:

void *MemPoolManager::alloc(unsigned int size) {
  void *ret = NULL;
  std::unique_lock<std::mutex> lck(mutex_);
  alloc_call_count_++;
  if (size > unit_size_) {
    // 请求的内存大小超过了 unit_size
    request_too_big_++;
    return_null_count_++;
    lck.unlock();
    return NULL;
  }
  if (free_count_ <= 0) {
    // 没有空闲的 unit
    return_null_count_++;
    ret = NULL;
  } else {
    // 从 free list 中取出第一个 free unit, 将其标记为 used, 并从 free list 中移除
    int f = first_free_;
    first_free_ = next_free_[f];
    next_free_[f] = -1;
    if (last_free_ == f) {
      last_free_ = -1;
    }
    in_use_[f] = true;
    // 计算该 free unit 的起始地址
    ret = reinterpret_cast<char *>(pool_) + unit_size_ * f;
    free_count_--;
  }
  return ret;
}

MemPool free

  • 计算要释放的 buffer 在 pool 中的 unit index;
  • 将该 unit 标记为 free, 并加入 free list
void MemPoolManager::free(void *buffer) {
  std::unique_lock<std::mutex> lck(mutex_);
  // 计算 buffer 在 pool 中的 unit index
  uint64_t offset = reinterpret_cast<char *>(buffer) - reinterpret_cast<char *>(pool_);
  unsigned int idx = offset / unit_size_;
  unsigned int mod = offset % unit_size_;
  // 将该 unit 标记为 free, 并加入 free list
  in_use_[idx] = false;
  int l = last_free_;
  if (l == -1) {
    last_free_ = idx;
    first_free_ = idx;
  } else {
    next_free_[l] = idx;
    last_free_ = idx;
  }
  free_count_++;
  return;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/616321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HDFS- DataNode磁盘扩缩容

HDFS- DataNode磁盘扩缩容 背景: 缩减/增加节点磁盘 方案介绍: 采用hdfs dfsadmin -reconfig 动态刷新配置实现,不停服扩缩容。 注意事项: 请在进行缩容之前,务必了解实际的数据量,并确保磁盘有足够的空间来容纳这些数据。还需要考虑未来的使用需求,要预留一定数量的空间…

面向电商家居行业3D室内场景合成中的空间感知

本文主要介绍了3D场景合成技术在电商领域&#xff0c;尤其是家居家装行业的应用。它解释了如何使用3D场景合成创建逼真的室内设计&#xff0c;让消费者能够交互式地查看和体验产品&#xff0c;提高购物的趣味性和效率。文章提到了两种主要的3D室内场景生成算法&#xff1a;传统…

Curator分布式锁

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 分布式锁服务宕机,…

RZ9692实训开发通信系统构建(含配置json配置文件)

实验名称 通信系统的构建 实验目的&#xff1a; 实现一个通信系统的构建&#xff0c;要求传输两路正弦波&#xff0c;和一路视频信号&#xff0c;要求在接受端完整接受正弦信号和视频信号。 一、实验原理&#xff1a; 数字通信系统的一般模型&#xff1a; 数字通信系统的一…

验证搜索二叉树

目录 题目 方法一 思路 优化 方法二 思维误区 递归关系推导 代码实现 题目 98. 验证二叉搜索树 难度&#xff1a;中等 给你一个二叉树的根节点root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含…

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…

QT的C++版本是如何从ui文件编译成C++可以使用的.h文件的

Desktop_Qt_6_7_0_MinGW_64_bit是一个编译器&#xff0c;可以将ui文件编译为.h文件。我们可以在项目文件下看到这一样一个文件&#xff1a; 这里的ui_mainwindow.h文件我们可以打开看一下&#xff1a;你会发现你所有的ui设计都被记录在了这里。 /***************************…

最新网页版USB转串口芯片CH340中文规格书手册(20240511)

前言 南京沁恒的产品已经很成熟了&#xff0c;完全可替代国外USB转串口产品&#xff0c;不必迷信FT232&#xff0c;CP2102之类了。 另外&#xff0c;急着买芯片&#xff0c;直接跑过去的&#xff0c;看过几次妹子了:) CH340手册&#xff0c;基于网页3.3版本&#xff0c;规格书…

作为一名新能源汽车热管理仿真工程师需要具备哪些素养与技能

作为一名新能源汽车热管理仿真工程师&#xff0c;需要具备多方面的素养与技能&#xff0c;才能胜任这一岗位的工作。从工程素养到技术技能&#xff0c;再到沟通能力和团队合作&#xff0c;以下是对这些方面的探讨。 理论知识基础 首先&#xff0c;工程素养是新能源汽车热管理仿…

现代制造之数控机床篇

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

Spring-Cloud-OpenFeign源码解析-01-OpenFeign简介

OpenFeign简介 OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指&#xff0c;就像调用本地方法一样调用远程方法&#xff0c;无需感知操作远程http请求。 OpenFeign和Feign的区别 Feign是Spring Cloud组件中一个轻量级RESTful的HT…

[算法][差分][延迟相差][leetcode]2960. 统计已测试设备

题目地址&#xff1a; https://leetcode.cn/problems/count-tested-devices-after-test-operations/description/ 解法一&#xff1a;暴力解法 class Solution {public int countTestedDevices(int[] batteryPercentages) {//特殊条件判断if(null batteryPercentages || ba…

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…

深度解析Nginx:高性能Web服务器的奥秘(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Nginx概述 2、Nginx的历史与发展 3、Nginx的…

Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 1.前言 我们在前面的文章讲解了Kubernetes的核心概念和服务部署&#x…

ViLT 浅析

ViLT 浅析 论文链接&#xff1a;ViLT 文章目录 ViLT 浅析创新点网络结构总结 创新点 本文先分析了4种不同类型的Vision-and-Language Pretraining(VLP) 其中每个矩形的高表示相对计算量大小&#xff0c;VE、TE和MI分别是visual embedding、text embedding和modality interact…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

解决“电脑开机黑屏Explorer进程卡死“问题

今天&#xff0c;给台式机按电源键&#xff0c;进入windows系统时&#xff0c;发现电脑黑屏了&#xff0c;昨天还好好的&#xff0c;怎么今天电脑桌面进不去了&#xff1f;想起Windows XP、Windows 7、Windows 10 、Windows 11等系统&#xff0c;在使用多个文件拷贝时&#xff…

python的import导入规则

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pycharm只能看到当前工作路径父目录下所有文件和项目根目录下所有文件二、sys或者图形界面添加解释器路径&#xff08;搜寻路径&#xff09;三、import导入…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游&#xff0c;可以带动乡村相关产业的发展&#xff0c;提高乡村居民的收入&#xff0c;促进乡村的经济发展和社会进步。此外&#xff0c;乡村旅游还能促进城乡交流&#xff0c;推动城乡统筹发展。 数据…