以下是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.内存池是不是不管有没有应用程序申请使用其中的内存,它都会占这么大
内存空间,除非内存池调度程序操作,其他程序或系统调用永远不会用到这
部分内存?