手写内存池以及原理代码分析【C语言】

内存池设计与实现 1. 内存池设计1.1 目的 在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中。1.2 要求 尽量减少内存碎片,平均效率高于C语言的malloc和free。1.3 设计思路 将buffer分为四部分,第1部分是mem_pool结构体;第2部分是内存映射表;第3部分是内存chunk结构体缓冲区;第4部分 阅读详情

内存池是对堆进行管理

当进程执行时,操作系统会分出0~4G的虚拟内存空间给进程,程序员可以自行管理(分配、释放)的部分就是mmap映射区、heap堆区,而内存池管理的部分就是用户进程的堆区。

为什么要用内存池?

内存池就是用来避免堆区出现碎片化

  • 避免频繁地分配和释放内存(防止堆区出现碎片化)

当客户端连接上服务端的时候,服务端会准备一部分的堆区用来做消息保留。当一个连接成功之后,服务器会在堆区为其分配一段属于这个连接的内存,当连接关闭之后,所分配的内存也随之释放。但是当连接量较大且过于频繁时,不可避免地对内存进行频繁的分配和释放。这会导致堆区出现小窗口,也就是堆区碎片化。

堆区出现碎片化会怎么样?

  • 长时间工作会出现不可查的BUG

  • 无法分配较大且整块的内存,malloc会返回NULL

内存池设计

场景:在一段很干净的堆区上,如何实现能避免内存碎片化的内存池?

第一:使用链表管理内存

使用链表将分配出来的一块一块内存在堆区连接起来,设置flag(是否被使用),让链表节点上的各段内存慢慢各自扩张。

单独使用链表会出现什么问题?

  • 内存块会被划分得越来越小,链表会变得越来越长,知道不能划分出更大得内存。

所以加入了固定内存的想法的设计

对于分配小段内存时,将小段内存进行固定划分,如下

  1. 16bytes

  2. 32bytes

  3. 64bytes

  4. 128bytes

  5. 256byts

  6. 512bytes

但是不同的固定小内存的分配的话就会出现以下问题:

1.查找慢

分配时查找

释放时候查找

2.块与块之间也会出现间隙

无法将块合并

小块回收麻烦

所以最后得出自定义固定小块和随机大块的内存池模型

内存池

内存池工作流程

​

内存池结构体

//内存池
struct mp_pool_s{

	size_t max;					
	
	struct mp_node_s *current;		//当前指向的小块内存区,链表结构
	struct mp_large_s *large; 		//大块内存

	struct mp_node_s *head[0];		//小块内存的头部
};

小块内存用单向链表串起来

//小块内存
struct mp_node_s{

	unsigned
固件工程师核心技能修炼:从C语言到底层调试的七项硬核能力 在嵌入式系统与物联网开发领域,固件(Firmware)作为连接硬件与操作系统的关键软件层,其开发要求工程师具备独特的底层思维与工程能力。其核心原理在于直接操作硬件资源,在严格的内存、时序与功耗约束下实现功能。掌握这项技术的价值在于能够构建稳定、高效的嵌入式产品,广泛应用于消费电子、工业控制与智能设备等场景。要胜任这一角色,工程师必须精通C语言的底层编程,例如熟练运用指针与位操作进行寄存器访问,并理解内存对齐与volatile关键字对硬件交互的影响。同时,RTOS(实时操作系统)的任务调度与同步机制,以及使用 阅读详情

相关推荐

深信服C/C++开发H卷考点解析:从指针内存到系统设计

C/C++作为底层系统开发的核心语言,其技术价值体现在对内存布局、指针操作、并发控制等底层原理的精准掌控,是网络安全、云计算等高性能基础设施的关键支撑。从基础的字符串处理、文件读写,到多线程同步、网络通信与系统设计,每一环节都考验开发者对资源分配与异常路径的工程认知。在深信服等安全与云计算厂商的校招笔试中,这些知识不仅以选择题形式考察概念理解,更通过编程题和代码分析题检验候选人的实战素养。掌握指针生命周期、内存泄漏排查、文件I/O边界处理以及高效并发模型,是应对这类综合性测评的核心路径。围绕深信服校招C/C

weixin_33785108的博客 462

C/C++程序员技术发展路径全解析:从底层到AI的进阶指南

在计算机编程领域,C/C++作为系统级和高性能计算的核心语言,其技术生态始终围绕性能优化、内存管理和底层控制展开。理解其编译链接原理、对象内存模型和多线程并发机制,是构建大型稳定系统的基石。这些技术能力在操作系统开发、游戏引擎、金融交易系统等对实时性和可靠性要求极高的场景中具有不可替代的价值。随着技术发展,现代C++工程化实践和工具链演进,如CMake构建系统和Clang/LLVM生态,正不断提升开发效率。同时,C/C++与AI推理、异构计算(如CUDA)的结合,为其在高性能计算和中间件领域开辟了新的应用前

weixin_34174322的博客 346

Linux C/C++实战进阶:AI Infra、后端与音视频开发核心能力栈解析

这类教程最值得先看的不是它覆盖了多少方向,而是它能不能帮你把零散的知识点,串成能解决实际问题的工程能力。特别是对于工作1-5年、想从“会写代码”转向“能搞定项目”的程序员,或者应届生想快速补齐项目经验,核心不是学更多新名词,而是搞清楚从原理到上线的完整链条里,每一步到底在做什么、为什么这么做、以及出了问题怎么查。 下面我会围绕Linux C/C++开发,拆解几个主流方向(AI基础设施、后端、音视频)的实战进阶路径。重点不是罗列知识点,而是告诉你每个阶段该优先掌握什么、怎么验证、以及从学习到落地的关键跳板在哪

weixin_34198881的博客 411

【信息科学与工程学】计算机科学与自动化——第一百三十四篇 编程语言篇 系列一 C/C++01

5. 适用于信号处理。

weixin_49199313的博客 21

【信息科学与工程学】【安全领域】第七十篇 负载均衡设备的主要算法01

每个服务器有一个对槽位的偏好排序, 调度器(表)需要为每个槽位分配一个服务器, 目标是整体上满足所有服务器的偏好(即均匀填充), 同时保持稳定性(变化小)。: 对于一个新到达的请求, 如果将其分配到当前有cj个请求(包括正在服务的)的服务器sj, 其期望等待时间为 (cj + 1) / μj。输入:服务器集群S={s1, s2, ..., sn}, 权重W={w1, w2, ..., wn}, 当前指针i。输出:选中的服务器sj。输入:服务器集群S, 各服务器当前活动连接数cj, 各服务器预设权重wj。

weixin_49199313的博客 524

【信息科学与工程学】【安全领域】第三十五篇 网络安全算法表

编号算法名称算法的逐步骤思考推理的数学方程式和分解的数学方程式参数/变量列表复杂度(时间/空间)1​AES (高级加密标准)​1. 密钥扩展:从初始密钥生成轮密钥。 2. 初始轮: 3. 主轮循环(Nr-1轮):  - SubBytes:(非线性字节替换)  - ShiftRows:对状态矩阵的行进行循环移位。  - MixColumns:(在GF(2⁸)上的矩阵乘法)  - AddRoundKey: 4. 最终轮:执行SubBytes、ShiftRows、AddR

weixin_49199313的博客 1379

保姆级教程:在Rockchip RK3588 SDK中,如何为你的新硬件板子创建第一个DTS文件

本文提供在Rockchip RK3588 SDK中为自定义硬件创建首个DTS文件的详细教程。通过分析DTS在RK3588开发中的角色、快速定位参考设计、实操步骤及调试验证方法,帮助开发者高效完成硬件板级配置,特别适合嵌入式Linux系统开发者参考。

weixin_28678831的博客 286

多思计算机组成原理实验:模型机课程设计

计算机组成原理实验教程 基于多思网络虚拟实验系统 张雯雰

Nick的博客 2万+

从共现矩阵到共现图一步到位——详解版

1.共现矩阵 判断大量不同文本之间,相邻词的联系,两词在所有文本中相邻的次数在矩阵中用数值表示。(参考此) 例子如下: 1.1 文本 • I like deep learning. • I like NLP. • I enjoy flying. 1.2 共现矩阵 2.共现图 2.1 数据预处理(节点和边) 获取文件node.csv和edge.csv。代码详见github仓库 2.2 共现图的制作 2.2.1 gephi的安装(参考此) (1)先下载gephi (2) 再配置java环境(下载java1.8

微乐的博客 4402

STC15W204S最小系统开发指南:从串口通讯到自动热加载全流程

本文详细介绍了STC15W204S最小系统的完整开发流程。从芯片资源解析、最小系统搭建、串口通讯驱动编写(使用Timer2生成波特率),到实现基于魔术值触发的自动热加载功能,并最终集成Keil与STC-ISP软件,构建高效的自动化开发工作流,显著提升嵌入式调试效率。

a1b2c的博客 391

用AList挂载网盘,无损看VR电影教程,无需下载到PICO头显本地!

用AList挂载网盘 + WebDAV直连头显,看片像拉本地一样流畅,不怕卡顿、不怕没空间,简直是VR看片刚需配置!别再用U盘传电影了,用AList + WebDAV,直接流畅看4K,看片效率翻倍,体验提升一个档次!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 5544

【动态导通电阻】GaN功率器件中动态导通电阻退化的机制、表征及建模方法

研究目的:鉴于动态RON退化对GaN功率器件性能的显著影响,本文旨在全面综述和讨论GaN功率器件中动态RON退化的机制、表征方法、建模技术以及解决方案,以期为GaN功率器件的设计、优化和应用提供理论指导和实践参考。内容概述:文章首先分析了缓冲层陷阱和栅极不稳定导致动态RON退化的物理机制,并通过物理基础的TCAD模拟与高压背栅测量结果进行对比,揭示缓冲层陷阱的充电/放电过程如何影响动态RON。接着,讨论了不同GaN器件技术中栅极不稳定引起的动态RON增加以及栅极过驱动的作用。

荷塘阅色 1166

Linux性能调优之CPU时间分布(亲和性、带宽、权重)配置

带宽权重亲和性进程级别Cgroup-v2服务级别systyemd我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫尔曼·黑塞《德米安》

山河已无恙 1713

五万字解析【ROOT 入门指南】

本文是cern官方root入门指南的初步翻译版,还在进一步校对中....

荷塘阅色 208

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 一文彻底掌握用户态协议栈,一看就懂的
下一篇: tcp协议栈实现,tcp定时器与滑动窗口实现
Linux服务器开发
博客等级 码龄7年 610粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值