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.mzph.cn/news/831004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扒开kafka内部组件,咱瞅一瞅都有啥?

Apache Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据管道和流式应用程序。它由几个核心组件组成&#xff0c;这些组件共同工作以提供高吞吐量、持久性、容错性和可扩展性。关于 Kafka 与其它类似的中间件的对比&#xff0c;这里V 哥就不再阐述了&#xff0c;…

leetcode-滑动窗口的最大值-95

题目要求 思路 1.这个题是可以暴力求解的&#xff0c;但是时间复杂度比较高&#xff0c;因此&#xff0c;这里说一个时间复杂度为O(n)的方法 2.因为这个代码是优化后的结果&#xff0c;第一次写如果直接写成这样着实不容易&#xff0c;因此&#xff0c;我直接讲每一行的含义。…

Linux系统应用与设置(1):比较、生成补丁以及应用补丁(diff与patch指令)

1. 简述 在我们应用Linux系统或基于Linux系统做一些软件应用开发时&#xff0c;经常会遇到需要将文件的改动记录下来&#xff0c;并且讲这些改动和差异应用到其他的Linux系统时&#xff0c;我们会用到diff和patch指令。 在Linux中&#xff0c;diff和patch是两个非常有用的命令行…

【网络基础】深入理解TCP协议:协议段、可靠性、各种机制

文章目录 1. TCP协议段格式1.1. 如何解包 / 向上交付1.1.1. 交付1.1.2. 解包 1.2. 如何理解可靠性1.2.1. 确认应答机制&#xff08;ACK&#xff09;1.2.2. 序号 与 确认序号 2. TCP做到全双工的原因2.1. 16位窗口大小2.2. 6个标记位 3. 如何理解连接3.1 连接管理机制3.1.1. 三次…

44. UE5 RPG 初始化敌人的属性

在正常的游戏中&#xff0c;我们应该考虑如何去初始化角色属性&#xff0c;并且要给角色分好类型。比如&#xff0c;在我们游戏中&#xff0c;我们如何去初始化小兵的属性&#xff0c;并且还要实现小兵随着等级的增长而增加属性。而且就是小兵也有类型的区分&#xff0c;比如我…

【数组】Leetcode 26. 删除有序数组中的重复项【简单】

删除有序数组中的重复项 其他算法导航栏 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 …

【C++STL】String类的常用函数用法总结

String类 一&#xff1a;String类的初始化方式二&#xff1a;String类的访问方式三&#xff1a;String的大小和容量四&#xff1a;string的插入&#xff1a;push_back() 和 insert()五&#xff1a;string拼接字符串&#xff1a;append() & 操作符六&#xff1a; string的删…

PhpAdmin-getshell

PhpAdmin-getshell 通过未授权成功写入&#xff0c;然后getshell 路径&#xff1a;C:\phpstudy_pro\Extensions\MySQL5.7.26\ 写入木马&#xff1a; into写入文件&#xff1a; 使用需看要secure_file_priv的值。 当value为“null”时&#xff0c;不允许读取任意文件 当value为…

Android 文件传输

经常写adb命令传文件&#xff0c;结果发现Android studio有自带的文件管理器&#xff0c;可以上传下载文件。

高扬程消防水泵在火灾中的关键作用/恒峰智慧科技

在火灾这一无情的灾难面前&#xff0c;每一秒都至关重要。而在这一分一秒的较量中&#xff0c;高扬程消防水泵无疑扮演着举足轻重的角色。它不仅是灭火战斗的得力助手&#xff0c;更是保障人民生命财产安全的守护神。 高扬程消防水泵&#xff0c;顾名思义&#xff0c;其扬程远超…

Gson打印按照想要的key顺序

默认大家都知道这个吧&#xff1f; val gson GsonBuilder().setPrettyPrinting().create() log(gson.toJson(bean))它是用于将对象bean&#xff0c;转成json以后&#xff0c;能够比较漂亮的打印出json的结构。我常用的是如下4个函数。 //就是jsonStr&#xff0c;使用该函数来…

qt对话框功能介绍

1、颜色对话框 //方式一QColor color QColorDialog::getColor(Qt::red, this, QString::fromLocal8Bit("颜色对话框"),QColorDialog::ShowAlphaChannel);qDebug() <<"color:" <<color;//方式二QColorDialog dialog(Qt::red, this); // 创建对…

通过自然语言处理执行特定任务的AI Agents;大模型控制NPC执行一系列的动作;个人化的电子邮件助手Panza

✨ 1: OpenAgents 通过自然语言处理执行特定任务的AI代理 OpenAgents是一个开放平台&#xff0c;旨在使语言代理&#xff08;即通过自然语言处理执行特定任务的AI代理&#xff09;的使用和托管变得更加便捷和实用。它特别适合于日常生活中对数据分析、工具插件获取和网络浏览…

vue2编写主体页面

目录 一. 导入两张图片 二. 新建主体vue 三. 修改路由 1. 新增主体界面Main.vue的路由 2. 完整router/index.js代码如下: 在Vue 2中编写一个主体页面通常意味着创建一个包含导航栏、侧边栏、内容区域等的布局。以下是使用Vue 2和Element UI框架来构建一个简单的主体页面的…

Kalfka是如何保证消息消费的顺序性和一致性的

Kafka通过一系列机制来确保消息消费的顺序性和一致性。以下是一些关键的方法&#xff1a; 分区&#xff08;Partitions&#xff09;&#xff1a; Kafka中的每个主题&#xff08;Topic&#xff09;都可以被分割成多个分区。消息在发布时会被追加到特定的分区中&#xff0c;而在每…

2024年第二十一届 五一杯 (B题)大学生数学建模挑战赛 | 最大流问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 第一个问题…

张大哥笔记:学什么都不如学赚钱

很多人总是这样认为&#xff1a;好好读书&#xff0c;考上好学校&#xff0c;将来可以找到一份不错的工作&#xff0c;这样的思想观念&#xff0c;可能会导致你一辈子都无法实现财富自由。 财富的多少&#xff0c;和你的努力程度没有直接关系。我们可以清楚看到那些每天辛苦劳动…

虚拟机软件:VMware VirtualBox Hyper-v

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 虚拟机软件是程序员必备的开发…

Leetcode—2739. 总行驶距离【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2739. 总行驶距离 实现代码 class Solution { public:int distanceTraveled(int mainTank, int additionalTank) {int consume 0;int ans 0;while(mainTank ! 0) {mainTank--;consume;if(consume 5 && additio…

【20】JAVASE-网络编程【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…