Mo2m4C;i$ZE0在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配和释放内存,会不断的增加系统的内存碎片,影响内核之

后分配内存的效率,这个时候一个比较可行的做法是采用内存池,先分配好比较多的内存,然后在这个已经分配的内存里使用内存,这样就不需要内核过多的参与内

存分配和释放的过程。o/E

j"@n

hW0

51Testing软件测试网/^$GI1\G

内存池根据应用不同有多种实现的策略,如有些分配很大的内存,然后将内存分配成大小相等的块,并将每个块链接起来进行管理。51Testing软件测试网(q"kXG4RU

51Testing软件测试网[-C{A5{o*?2J

下面对模型介绍的时候,为了简单,不加入用于调试的编写技巧和为之准备的结构,其实主要是省去间接调用,有时为了调试,会将文件及所在行以及主要的变量状态输出。51Testing软件测试网EIxW,K?4q0Mi

eB4c_&W6ZEm/F0一、内存池访问接口iL7`2[z0

y.c0D2Dnd0创建大小为size的新的内存池。51Testing软件测试网QA4dEQZ!p:Ip

c+k`s)@ g"W#T0q-sW1l?w0pool_t _pool_new_heap(int size);

51Testing软件测试网_;X!SPGk9T*O

从指定内存池中分配大小为size的内存空间,这些空间会在内存池释放时,被自动的释放。51Testing软件测试网ixYY_,](z+]

51Testing软件测试网gO$|}} y

,bBS$[Kr f$V0void *pool_malloc(pool_t, int size);

9^)a$zDo'\5C0内存池的大小,返回内存池中所有内存块的大小总和N}T,X#@r0

51Testing软件测试网AL{(iIPrz

51Testing软件测试网;FY0P)Gl9X,Vint pool_size(pool_t p);

(sT8Kxp

yz0释放内存池,这会导致所有内存被释放,同时内存池本身也被释放gy)|$}m7W)r3e e0

51Testing软件测试网-]Y"hhPjxn

w@k)X!p2LB!cz*\'E0void pool_free(pool_t p);

51Testing软件测试网u6DhX,g9d

Ck.Yx

还有其它的一些接口,但这些是主要的接口。51Testing软件测试网0s!ZX4t8`6R9c:_X

r }

8AB}%r D;aL:S0二、数据结构7P N\"^.b(W#L [0

zw b j.F*}a)x0

51Testing软件测试网S@GfmX[qstruct pheap

e"XJQ&r)x+]+y0{

'w5L5oO$M Kq(ARZ3@0    void *block;51Testing软件测试网&KJo_

F4x/q5Q!FD!K

int size, used;

k`hx?R0};

1|s+nq+JDVO0该结构表示内存池中一个内存块的抽象表示,51Testing软件测试网v8_lpL'v

'u*kMq

X0A9vg6x01、block 用于指向由malloc所分配的内存地址。51Testing软件测试网!b|5Gs1qIMK!|K

R1nrd n02、size 表示block所指向地址的内存大小。I?8@leq Y"B0

51Testing软件测试网u^O1FUIIU

3、used 表示多少处于已经使用的状态。在分配内存时,这个域很重要,它表示内存块可以被分配的偏移值,也就是从used开始的内存都是可以被从内存池中分配出去的。51Testing软件测试网&Nuf5a@HW?s

51Testing软件测试网wrI2^`8\ CuIx

I+I"xuD8u|N0struct pfree

#@7Yw4a c%[L0{51Testing软件测试网o*s}PiC\:l

i |

pool_cleanup_t f;51Testing软件测试网\e.`+^Kv9F)~-ng8G

void *arg;51Testing软件测试网-mQxu+srJ^n

struct pheap *heap;

#w5~ko[;x{5ns7Q0    struct pfree *next;51Testing软件测试网"ea]y7Y+g

};51Testing软件测试网F0up`Ewc/F

typedef void (*pool_cleanup_t)(void *arg);

t|f_h+vh&z|c{0这个结构用于实现一个链表,将所有的内存块链接起来。每一个内存块,对映一个这个结构,也就是每个struct pheap结构,都有一个struct pfree结构将其封装起来,这个结构主要实现下面几个功能:51Testing软件测试网0{.m'?"JIN

J%t |

F*H1~

D"s3SBT01、实现内存块的链表,用struct pfree *next连接起来,这是一个单链表。Tz$g&N2y*~M0

51Testing软件测试网2sa0oHp5{$v0q7D

2、内存块释放的回调。注册在释放内存时,如果释放这个内存块,主要是通过pool_cleanup_t f和void *arg两个域来完成这个功能。51Testing软件测试网p/JEknz

51Testing软件测试网5@P,U6E#f.L

3、pheap域用于指向需要被放入链表的内存块,就是前面的结构。51Testing软件测试网6q6uER,l!D]

:V%v%K/j\0

51Testing软件测试网WW)|s0e}1Ytypedef struct pool_struct

$}5r"Ci1h0{

/]#b7L@({!J0    int size;

aQjn o

u4N0    struct pfree *cleanup;

0Ql$A%Ys.DIJ&z.M0    struct pfree *cleanup_tail;51Testing软件测试网b'}(}v2c3w?

struct pheap *heap;

{?1xe1fy9MOJ0} _pool, *pool_t;

51Testing软件测试网{$|b;BS7]T`

结构中的域代表如下:M%~ q{7V0

51Testing软件测试网f'x1R4[H

heap:指向内存池中最新申请的内存块,在每次申请内存块时,都会将其指向新的内存块。51Testing软件测试网Iud `ux

w"}2F7z,sL_0cleanup和cleanup_tail:指向链表的头和尾的指针。^AE5nv6j-kt0

4iB*i]Mw'eCT3q*U'@G0size:表示内存池中内存的大小,包括所有的内存块。pImu

G;l051Testing软件测试网+|2I2W2J~

这个结构的主要功能如下:51Testing软件测试网5br}6[g8x

:zC.RV*_w$l9N01、管理内存块。通过cleanup和clean_tail两个指针,因为内存块在内存池中是以单链表的形式组织的,这两个指针分别指向链表的头和尾指针。0QL]AbI0

51Testing软件测试网@4^/{:PNeD7T

2、内存池中可用的内存大小。通过size域来统计完成。s&zPLzwu0

8e]&z

任意大小 内存池 c语言,C语言内存池使用模型-1 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...相关推荐

  1. c语言内存池中 二维数组,C语言内存池使用模型-2 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    51Testing软件测试网A(@B-BHcSd4l 五.内存池管理内存机制(单链表管理结构)51Testing软件测试网!d"ZpnNr3K8IM;jsx51Testing软件测试网!dB ...

  2. 小林c语言语,C语言资料下载 - 北京-小林-攻城狮 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    \W's N$p!RWQo/e0 C"cV/R*^0还有些其他的C语言的资料: af)Q8[tG0C语言趣味程序百例精解 s.R,R[+AC!G0http://bbs.topsage.com ...

  3. java软件测试经典案例,java语言编程案例 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    1.编程实现:二分搜索算法 解答: public class SearchTest { /** 被搜索数据的大小 */ private static final int size = 5000000; ...

  4. c++语言绝对值函数,由C++绝对值函数想到的 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    这些天恰好要用到一个绝对值的函数.好吧,你会说这个直接用std::abs不就行了吗?对的,一开始我也是这样用的.但是如果去求最小的那个int的值的绝对值,就会导致输出不正确.如:int min_int ...

  5. ios nslog 例子_iOS 典型内存泄露案例 - zhenshan2013的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    最近进行iOS 安全黑匣子的测试,在Demo中通过不断的点击调加密接口,同时通过苹果自带instrument的leak工具监控,发现典型的内存泄漏,监控图如下: 上图中红色的部分表示该操作触发的代码有 ...

  6. db2 修改表空间自增长_db2自动调整表空间的大小 - 木子日京的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    db2自动调整表空间的大小 上一篇 / 下一篇  2009-02-06 11:47:19 在 DB2® 数据库系统中存在两种类型的基本表空间:系统管理的空间(SMS)和数据库管理的空间(DMS). 与 ...

  7. C# 汉字字符取模韩语日语意大利语俄语法语西班牙兼并葡萄牙等 任意语言 任意大小 任意字体 任意排列 字符汉字取模及显示编码unicode

    视频演示:https://www.bilibili.com/video/BV1N54y117is/ 软件下载 功能:支持汉字.字符.韩语.日语.意大利语.俄语等任意语言,任意大小,任意字体,任意排列方 ...

  8. c语言 获取可用内存大小,C语言实现获取内存信息并输出的实例

    C语言实现获取内存信息并输出的实例 实现实例代码: headfile.h #include #include #include #define TRUE 1 #define FALSE 0 #defi ...

  9. 矩形换位算法C语言实现,关于C#:任意大小的矩形矩阵的运行时有效换位

    我迫切需要时间来优化大量的C代码以提高速度,我正在寻找一种算法-最好是C"代码段"-可以转换任意大小的矩形源矩阵u[r](行数,c列数)放入目标矩阵v▼显示[d](s = c行数, ...

最新文章

  1. 文件流能转换格式吗_amr转换mp3格式文件
  2. 全球首届APMCon,带你给“应用性能”把把脉
  3. Django uWSGI+Nginx配置
  4. 长方形与圆最近连线LISP_编写一个AutoLISP程序,画出一个边长为A的正方形,以及该正方形的内切圆,正方形的底边与正X轴的夹角为ANG...
  5. 推荐華麗の真実的小说《The★Sakuray》
  6. 开源绘画应用 Pinta 已移植到GTK 3和.NET 6
  7. 【Python】Python库之Web网站开发
  8. 分享一个列表查询查看多选基础资料的解决方案
  9. 试从微型计算机的硬件组成角度谈谈单片机,单片机原理及应用习题答案
  10. win10装debian 双系统_超详细小白部署win10和debian10双系统教程
  11. 一文搞懂linux磁盘管理以及各场景扩容需求(实操)
  12. pandas中每个元素减去所在行的平均值
  13. 2021计算机专硕调剂院校,2021年已公布的调剂院校专业
  14. 新计算机分区,全新的电脑怎么给新硬盘分区?
  15. flex布局右列固定左列自适应,遇到white-space nowrap 影响布局超长的问题
  16. 七月与安生:不管选择哪条路,都会是辛苦的 — —豆瓣老丑
  17. 【BitLocker】解锁后快速上锁(不重启电脑)
  18. RS232 MODBUS通信协议工业自动化RFID读卡器JY-L8820
  19. 不要在linux上启用net.ipv4.tcp_tw_recycle参数
  20. 金牧饲料配方软件的使用方法

热门文章

  1. 免费阅读正在杀死腾讯阅文?
  2. 通过一张照片,获取照片的地址信息
  3. 电力电子转战数字IC——我的IC笔试(2022.10.14更新)
  4. 使用Openssl签发SSL证书
  5. Java端生成二维码
  6. LeetCode刷题记录
  7. element表格固定表头每列宽度,最右侧固定后,溢出出现滚动条内容和表头不能同时移动
  8. Android限制录制屏幕无声音,哪一个安卓录屏软件可以录制系统的声音
  9. init和destory方法
  10. Unity translucent SSS 次表面散射 皮肤材质研究