AMPS:内存管理(一)

  高效的内存管理是卓越的软件产品的必备特征,如果在分配和释放内存时包含了代价高昂的查找、排序、重新组合操作,内存处理可能会成为系统性能的瓶颈。AMPS内存管理子系统的设计目标如下:

  • 内存管理必须快且系统开销小。
  • 在不引入垃圾收集器的前提下尽可能地减少内存泄露。
  • 内存分配后保持相对长的时间来减小释放引起的系统开销。
  AMPS通过以下方法达到如上目标:
   应用协议服务器通常以突然爆发的方式使用内存,他们通过使用较大的数据结构来完成数据处理,然后丢弃这些数据结构。比如说处理来自网络的一条协议消息,消息进入系统后,通常进行解析、处理,有可能会修改,增加一些新的数据,或者删除、更新一些数据,在每一个处理阶段,都涉及动态分配内存,这些内存可能在消息离开系统之后才进行释放,或者,每个独立的内存对象在一个阶段处理完成切换到另一阶段时,内存可能被释放,然而,如果在所有阶段全处理完再释放,这样的做法优于前者,原因如下:
  1.   如果我们累积所有分配的小块内存,然后一次性释放,在本质少可以减少内存泄露,因为我们不需要在多个地方进行释放操作,从而避免了遗漏。
  2.   在一开始预分配一大块内存,当消息进入系统后,通过建立的简单,高效的分配器在这个buffer上面分配小的内存对象,这样就不用担心管理释放内存的链表以及小对象分配引起的系统开销。
 列举一个协议消息的例子,当消息到达系统后,能过编程语言提供的内存分配函数分配一个大的buffer,定义一个指针指向buffer的开头,这样就形成了特定消息的内存管理对象,当消息开始并经过不同处理阶段,应用程序使用一个特殊的API将内存管理对象当做参数来进行内存分配,分配函数只需通过简单地移动指针来分配所需要的字节,并且返回分配前指针所在地址,应用程序在将来可通过这个指针来写buffer,随后的分配需要向前移动指针。有可能在消息还没离开系统前,预先分配的大块内存已经被使用完了,如果这种情况发生,我们必须分配一另一块大的buffer,并将其拼接在前一个buffer之后,接着从这个新的buffer开始分配。另外,我们需要将在buffer上分配的内存块对象挂到一个链表上,当系统不再需要此消息时,将链表释放。因为所有的分配都是从预先分配的buffer上进行分配,仅需要给指针增加一个要求的内存大小即可,分配相当高效。

   AMPS提供一个API来在创建上层的内存存管理对象,这个API返回一个对象做为参数传递个另一个分配API,其分配和销毁细节如上所示,在管理对象内部建立的buffer链表,通过内存管理对象提供的另一个API来释放。

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值