关于内存池的一些疑问~~

kikikind 2009-08-08 05:52:52
最近面试被问了一个内存池的实现,关键是内存块的组织,说来惭愧,由于之前没有详细去了解过实现,只记得操作系统上有说过空闲链表的实现,即按分配的块用链表链接,有小块优先,大块优先等~~~~
后来回来认真地找了几个内存池实现的技术介绍,多数是以一个固定块,每个块又有固定长度的单元组成。但是小于块长度的内存分配请求会浪费空间,大于块长度的请求,又要用多块拼接而成。然而拼接的方法是个很大问题,如果设计为连续内存块,会有很严重的空洞问题;如果设计成链表结构,所有和这段信息相关的处理函数就都需要支持这种链表,否则就会引入额外的内存拷贝。
所有我有几个疑问:
(1)大块内存要怎么分配好呢?还是直接用系统分配实现?
(2)大家能否介绍一下工作中用到内存池地方,以及带来的性能效应怎么样呢?
...全文
223 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
stjay 2009-08-09
  • 打赏
  • 举报
回复
可以参考一下 boost::pool
fallening 2009-08-09
  • 打赏
  • 举报
回复
牛魔王的modern c++ design 里边专门出了一章讲解这个问题
pengzhixi 2009-08-09
  • 打赏
  • 举报
回复
(1)大块内存要怎么分配好呢?还是直接用系统分配实现?
个人认为大块内存直接用系统分配实现更好,用内存池的话多了很多 步骤

(2)大家能否介绍一下工作中用到内存池地方,以及带来的性能效应怎么样呢?
个人觉得内存池多用在那些内存块比较小,而且经常分配释放频率比较高的时候。因为如果是大块内存的使用用内存池效率不好!!还有就是如果是小块的内存如果经常需要分配和释放的话,用内存池效率比较快
我啃 2009-08-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 healer_kx 的回复:]
Mozilla也有一个很成熟的内存池,可以参考。
[/Quote]
此人也写过一个
healer_kx 2009-08-09
  • 打赏
  • 举报
回复
Mozilla也有一个很成熟的内存池,可以参考。
darkwalkertt 2009-08-09
  • 打赏
  • 举报
回复
http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html
看看这个吧,或许对你有点帮助。
kikikind 2009-08-09
  • 打赏
  • 举报
回复
TO darkwalkertt: 我也是看了这个哈,所以才有这些疑问呀~~~

To healer_kx: 哦,可能直接看成熟的实现比较复杂呀,看还先从原理性的实现入手好点哈

To pengzhixi:嗯应该是这样的了,也有地方写如块申请大于128K的就系统的分配

谢谢各位指点哈~~
vcchen_bo_qiang 2009-08-09
  • 打赏
  • 举报
回复
学习中、、、
baihacker 2009-08-09
  • 打赏
  • 举报
回复
在TAOCP上也讲过...貌似是第一卷...
Dansley 2009-08-09
  • 打赏
  • 举报
回复
帮顶
C_Plus87 2009-08-08
  • 打赏
  • 举报
回复
可以有固定分区分配(分配方法如字面意思,不再累述)
可变分区分配,为进程分配的空间是可变的(依照需要变化),其中又有几种不同的具体分配方法如:
最佳适应算法:进程退出后返还占用的内存,但是会产生不连续的内存,就像磁盘碎片一样。最佳适应算法就是从剩下的内存中找到一块大小最合适(不一定和需要的一样大,但必须>=需要的大小)的分配给进程,当然只分配进程需要的大小而那一块中剩下的部分(如果还有剩下)依然空闲。
首次适应算法:从头开始进行匹配,当第一次找到>=需要大小的内存块就进行分配。
循环首次适应算法:和首次适应差不多,只不过他不从头开始匹配,他是从当前的下一块内存开始匹配。
每种分配方法都有自己的优点和缺点,应当视具体情况选择。

wanghao111 2009-08-08
  • 打赏
  • 举报
回复
操作系统 存储空间管理
baihacker 2009-08-08
  • 打赏
  • 举报
回复
一般是先申请一大块...然后再分...

至于要怎么处理,技术就很多了...

总之,内存分配主要是大小内存的分配和回收造成的内存碎片的问题上.

可以指定几种固定大小的内存,然后写个分配器(只是一种解决方案)
kikikind 2009-08-08
  • 打赏
  • 举报
回复
另外如果是用于多线程,同步也是一个问题,如果是小块内存,直接在栈中申请又会怎么样呢?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧