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软件测试网-软件测试人的精神家园...
如果觉得《任意大小 内存池 c语言 C语言内存池使用模型-1 - Mr.南柯 - 51Testing软件测试》对你有帮助,请点赞、收藏,并留下你的观点哦!