注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

偶有所得,记录在此

有分享交流才有进步,永远不要固步自封

 
 
 

日志

 
 

关于 C 内存管理  

2010-04-19 11:33:05|  分类: c programming |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
内存泄漏的本质原因在于,从堆上分配的内存在其生命周期结束时,未被及时释放造成的。

大部分用 C 写的应用,如:Nginx, Apache 等,都实现了一个叫“内存池“的东西;该模块的作用重点在于防止内存泄漏,Nginx 的实现貌似还有防止内存碎片之功效;但他们都有一个共同点,就是都没有“池”的功效,都不能复用池内的内存,取名为 “内存池” 实在让人误解。

Nginx 内存池管理着所有具有相同生命周期的内存块 (大块内存可以单独释放)。申请内存时,内存池会记录下来申请出来内存的起始地址,然后以链表的形式存储下来;释放时,手动调用内存池的 destory 函数,它会遍历前面的链表,对之前申请的内存块逐个执行 free 来释放内存。如果能确保每块内存都能记录到内存池,结束时,保证 destory 内存池,那么就不会有内存泄漏的存在。

总结起来,这部分主要涉及三个点:
  • 内存生命管理器
    Nginx 和 Apache 的内存池主要就是实现了一个内存生命周期管理器,防止内存泄漏。
  • 如何防止内存碎片
    Nginx 直接在一个已分配好的内存块上分配小块内存,避免多次 malloc 小块内存造成内存碎片,提高内存的使用效率。
  • 真正的内存池
    其实库函数 malloc 的实现就是一个内存池,调用 malloc 分配内存时,它会首先在池内寻找合适大小的内存块,如果没有,它会调用 sbrk 在堆上个分配一个新的内存块,然后挂接到内存池上。执行 free 时,仅仅是把这块内存做一个 available 的标记(可能还会执行一些内存合并)即可。大部分类 malloc 的实现,都是一个内存池。

每个 C 程序,都应该实现一个简单的内存生命周期管理器,来防止内存泄漏。至于内存碎片,这是 malloc 系列库应该解决的问题,有很多很高效的实现,通常无需关心。








  评论这张
 
阅读(339)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017