找回密码
 注册
搜索
查看: 1439|回复: 7

[讨论] 嵌入式系统里为什么要引入内存池这个概念?

[复制链接]
发表于 2006-7-4 08:46:00 | 显示全部楼层 |阅读模式
以下是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.内存池是不是不管有没有应用程序申请使用其中的内存,它都会占这么大
  内存空间,除非内存池调度程序操作,其他程序或系统调用永远不会用到这
  部分内存?
发表于 2006-7-5 13:57:00 | 显示全部楼层
<P>1.用于动态内存分配,当然可于用于两个程序间交换数据</P><P>2.是会浪费.不固定的话, 内存分配将变得非常很复杂.当然块的大小自己也可以调整,</P><P>  不过一般这一个OS都帮你做好了.</P><P>3. 地址是固定的,这取决于你的内存配置.</P><P>4. 是的,大小要自己调整.</P>
点评回复

使用道具 举报

发表于 2006-7-15 13:32:00 | 显示全部楼层
正如ruanhaishen  R&S内核的作者的解释, 内存池的概念是基于固定大小的内存块的。
嵌入式系统对性能非常敏感, 因此实现要力求简单, 如果内存块大小非固定, 那么堆内存的回收时间将会不固定, 且算法相对复杂, 这对于很多实时系统是不可接受的。
点评回复

使用道具 举报

发表于 2006-7-18 13:10:00 | 显示全部楼层
了解了,又学了点东西!
点评回复

使用道具 举报

发表于 2006-8-3 15:51:00 | 显示全部楼层
VxWorks中通过内存池实现数据的交换,提高了RTOS的实时性。mBlk-clBlk-cluster结构.
点评回复

使用道具 举报

发表于 2006-8-5 15:28:00 | 显示全部楼层
学习,学习,再学习了些!
点评回复

使用道具 举报

发表于 2006-9-20 22:59:00 | 显示全部楼层
多謝大大分享那樣棒的資料
点评回复

使用道具 举报

发表于 2006-9-23 01:49:00 | 显示全部楼层
又学了点东西!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-30 17:41 , Processed in 0.048035 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表