linux高性能服务器--定长内存池设计

内存池

内存池是指程序预先从操作系统申请一块足够大内存,此后当程序中需要再次申请内存的时候,直接从内存池中获取;当程序释放内存的时候,是返回给内存池保管。

开源内存池: tcmalloc

功能:
  • 避免频繁分配和释放内存
  • 避免生成大量的内存碎片,避免出现莫名的问题( 如 malloc 之后没有 memset)
code

代码实现申请固定大小的内存空间, 实现堆的管理,4K一个页 ,每块32个字节,一个页共128块

#include <stdio.h>
#include <stdlib.h>


#define MEM_PAGE_SIZE 0x1000   // 4k大小
// 内存池定义
typedef struct mempool_s {
    int block_size; // 每块的大小
    int free_count; // 剩余多少块可以用
    char * free_ptr; // 可以分配的开始位置
    char * mem; // 分配内存的位置
}mempool_t;

int memp_init(mempool_t *m, int block_size) {
    m->block_size = block_size;
    m->free_count = MEM_PAGE_SIZE / block_size;
    m->free_ptr = (char *)malloc(MEM_PAGE_SIZE);
    if( !m->free_ptr) return -1;
    m->mem = m->free_ptr;
    int i =0;
    char *ptr = m->free_ptr;
    for( i = 0; i< m->free_count; i++) {
        *(char **)ptr = ptr + block_size; // block中前8个字节为指针,指向下一个block的地址
        ptr += block_size;
    }
    *(char **)ptr = NULL;
    return 0;
}
char * mem_alloc(mempool_t * m) {
    if(!m || m->free_count == 0) return NULL;
    char * ptr = m->free_ptr;
    m->free_ptr = *(char **)ptr;
    m->free_count--;
    return ptr;
}

void * mem_free(mempool_t * m, void * ptr) {
    *(char **)ptr = m->free_ptr;
    m->free_ptr = (char *)ptr;
    m->free_count ++;
}

int main() {
    mempool_t m;
    memp_init(&m,32);  //分配32个字节大小的内存
    void * p1 = mem_alloc(&m);
    printf("mem_alloc p1 : %p\n",p1);

    void * p2 = mem_alloc(&m);
    printf("mem_alloc p2 : %p\n",p2);


    mem_free(&m,p1);
    mem_free(&m,p2);
	
	void * p3 = mem_alloc(&m);
    printf("mem_alloc p3 : %p\n",p3);

    void * p4 = mem_alloc(&m);
    printf("mem_alloc p4 : %p\n",p4);
    
}

运行结果:
mem_alloc p1 : 00732610
mem_alloc p2 : 00732630
mem_alloc p3 : 00732630
mem_alloc p4 : 00732610

0x20 == 32 字节
申请新的空间,采用头插法,先插入p3,后插入p4, p4的地址取代p1,
p3的地址取代p2

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

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

相关文章

OpenNJet:下一代云原生应用引擎

OpenNJet&#xff1a;下一代云原生应用引擎 前言一、技术架构二、新增特性1. 透明流量劫持2. 熔断机制3. 遥测与故障注入 三、Ubuntu 发行版安装 OpentNJet1. 添加gpg 文件2. 添加APT 源3. 安装及启动4. 验证 总结 前言 OpenNJet&#xff0c;是一款基于强大的 NGINX 技术栈构建…

Java苍穹外卖04-

一、缓存菜品 1.问题说明 2.实现思路 就是点击到这个分类的时候就可以展示相应的菜品数据 3.代码实现 在user的菜品的contoller中&#xff1a;增加判断redis中是否存在所需数据&#xff0c;不存在添加&#xff0c;存在直接取得 这里注意&#xff1a;你放进去用的是List<Di…

【Osek网络管理测试】[TG3_TC3]tSleepRequestMin_L

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT进入NMLimpHome状态后请求睡眠的最短时间是否正确…

Flink时间语义 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

SpringBoot+Vue+Element-UI实现学生综合成绩测评系统

前言介绍 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#xff0c;所以有必要开发学生综合成绩测评系…

校园寄取快递代拿小程序源码系统 带完整的安装代码包以及搭建教程

在数字化快速发展的今天&#xff0c;校园生活也在不断地与时俱进&#xff0c;向着更加便捷、高效的方向迈进。为了满足学生们对于快递寄取代拿的便捷需求&#xff0c;小编给大家分享一款校园寄取快递代拿小程序源码系统&#xff0c;该系统不仅提供了完整的安装代码包&#xff0…

矩池云jupyter运行opengait代码 未完成版

文章目录 前言——矩池云的使用技巧1.切换源 一、下载数据集二、下载模型三、环境配置1.查看python、torch、torchvision版本2.查看一些包版本是否过高3.下载包 四、开始训练1.设置环境变量2.遇到的问题&#xff08;1&#xff09;torch.cuda.is_available()返回false&#xff0…

python绘图(pandas)

matplotlib绘图 import pandas as pd abs_path rF:\Python\learn\python附件\pythonCsv\data.csv df pd.read_csv(abs_path, encodinggbk) # apply根据多列生成新的一个列的操作&#xff0c;用apply df[new_score] df.apply(lambda x : x.数学 x.语文, axis1)# 最后几行 …

接口自动化测试拓展:接口Mock的理念与实战场景!

接口自动化测试是软件开发过程中不可或缺的一环。在实际开发中&#xff0c;我们常常会遇到需要依赖其他模块的接口或者服务来完成测试的情况。而在开发初期或者接口尚未完成的情况下&#xff0c;就需要使用接口Mock来模拟未实现的接口功能。接口Mock是一种模拟接口行为的技术&a…

基于树的时间序列预测(LGBM)

在大多数时间序列预测中&#xff0c;尽管有Prophet和NeuralProphet等方便的工具&#xff0c;但是了解基于树的模型仍然具有很高的价值。尤其是在监督学习模型中&#xff0c;仅仅使用单变量时间序列似乎信息有限&#xff0c;预测也比较困难。因此&#xff0c;为了生成足够的特征…

每日两题 / 24. 两两交换链表中的节点 25. K 个一组翻转链表(LeetCode热题100)

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 定义三个指针&#xff0c;交换前先保存ntnt指针为next->next&#xff0c;cur和next两个节点&#xff0c;然后将pre->next指向next 若pre为空&#xff0c;说明当前交换的节点为头两个节点&#xff0c;…

《Python编程从入门到实践》day20

#尝试在python3.11文件夹和pycharm中site-packages文件夹中安装&#xff0c;最终在scripts文件夹中新建py文件成功导入pygame运行程序 #今日知识点学习 import sysimport pygameclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(…

动态规划——背包问题(01,完全,多重)

一、01背包问题 1.题目描述 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。输出最大价值。 01背包问题特点&…

数据分析之Tebleau可视化:树状图、日历图、气泡图

树状图&#xff08;适合子分类比较多的&#xff09; 1.基本树状图的绘制 同时选择产品子分类和销售金额----选择智能推荐----选择树状图 2.双层树状图的绘制 将第二个维度地区拖到产品分类的下面---大的划分区域是上面的维度&#xff08;产品分类&#xff09;&#xff0c;看着…

cmake进阶:文件操作

一. 简介 前面几篇文章学习了 cmake的文件操作&#xff0c;写文件&#xff0c;读文件。文章如下&#xff1a; cmake进阶&#xff1a;文件操作之写文件-CSDN博客 cmake进阶&#xff1a;文件操作之读文件-CSDN博客 本文继续学习文件操作。主要学习 文件重命名&#xff0c;删…

C++引用2

什么是引用变量&#xff1f; 引用实际上是已定义变量的别名&#xff0c;使一个变量拥有多个名字 c给&#xff06;符号赋予了另一个意义&#xff0c;将其用来声明引用 int a9;int&ba; 此时b成为a的一个别名&#xff0c;a就是b,b就是a.它们均指向同一片内存 int a99; in…

虚拟键代码

虚拟键代码 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn 在Windows操作系统中&#xff0c;虚拟键代码&#xff08;Virtual-Key Codes&#xff09;是一组用来表示键盘上按键的数值。这些代码通常用于Windows API函数&#xff0c;以便程序能够识别和处理键盘输入。 虚拟…

OSEK任务管理

1 前言 RTOS通过任务&#xff08;task&#xff09;来组织应用层程序框架&#xff08;framework&#xff09;&#xff0c;支持任务的并发和同步执行&#xff08;concurrent and asynchronous execution of tasks&#xff09;&#xff0c;并通过调度器&#xff08;scheduler&…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.1

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

超分辨率重建——BSRN网络训练自己数据集并推理测试(详细图文教程)

目录 一、BSRN网络总结二、源码包准备三、环境准备3.1 报错KeyError: "No object named BSRN found in arch registry!"3.2 安装basicsr源码包3.3 参考环境 四、数据集准备五、训练5.1 配置文件参数修改5.2 启动训练5.2.1 命令方式训练5.2.2 配置Configuration方式训…
最新文章