嵌入式linux内存池,嵌入式系统里为什么要引入内存池这个概念?

以下是ruanhaishen  R&S内核的作者的解释:

/*******************************************************************

一个内存池(pool)是由N个固定尺寸的内存块(Block)组成,如{10, 3}代表一个内存池包含了3个10字节

大小的内存块。

如果申请一个5字节的内存块

kmalloc(5)

那么这个内存池就可以满足并返回一块(Blocks)给应用。

虽然应用只需要5个字节,但是内存池是把整块(10字节)返回。

这样虽然浪费了5个字节空间,但不会带来内存碎片的问题,

这在嵌入式系统中是非常重要的。

如果需要一个20字节的空间怎么办?

那上面的内存池就没法满足了,因为每一块的尺寸只有10字节。

为了满足所有不同的尺寸需求,比如系统中最大需要1024字节的内存块,

我们可以使用一个大尺寸的内存池

如 {1024, 100}。这样就有了100个1024字节内存块(Blocks)

虽然满足了所有的需求,但对于

kmalloc(5)

也需要浪费掉一个1024字节的Block,这样的内存利用率是很低的。

更好的方法就是开辟多个不同尺寸的内存池

{32,100}

{256,100}

{512,60}

{1024,20}

对于

kmalloc(5)、kmalloc(1024),分别使用不同的内存池分配。

这样可大大提高内存使用效率。

明白这点就不难划分内存池,具体划分方法是要根据应用对动态内存需求来规划的。

特别是内存资源很有限的系统,是需要仔细合理的安排。

注:实际上每一个Block需要预留一个管理用的结构,大小占用一个指针空间(ARCH_PTR_SIZE的定义),

如:满足kmalloc(5),需要定义Block至少为(5+ARCH_PTR_SIZE)

*******************************************************************/

我还是没看懂,所以来这里请各位高手来帮我解决:

1.为什么要引入内存池这个功能?做应用程序的临时数据存储吗?如果是这

样,能不能拿它用于两程序间的数据交换?

2.为什么要固定内存池块的大小,如果很多程序都不能完全利用一个块,那不

是浪费很多内存?

3.这片内存池在内存中的地址是不是固定的?

4.内存池是不是不管有没有应用程序申请使用其中的内存,它都会占这么大

内存空间,除非内存池调度程序操作,其他程序或系统调用永远不会用到这

部分内存?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值