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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值