1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UEF大内存管理的实现与使用 2006年05月24日 UEF大内存管理的实现与使用 导言 培训内容 介绍一种抗碎片的动态内存管理方法,以及UEF中的实现与使用方法。 UEF大内存管理的实现与使用 导言 培训目标 了解UEF中大内存管理的设计思想和适用情况,并且掌握它的使用方法。 UEF大内存管理的实现与使用 导言 准备知识 —— C/C++中的存储模型 UEF大内存管理的实现与使用 什么是动态内存 UEF大内存管理的实现与使用 什么是动态内存 动态内存就是在程序运行过程中动态的分配和释放的内存资源,相对的有静态内存(程序装载时分配并一般由操作系统在程序结束时释放)和栈内存(运行时自动调整栈指针分配和释放,先分配的后释放)。 UEF大内存管理的实现与使用 标准动态内存管理 malloc() / free() new / delete UEF大内存管理的实现与使用 标准动态内存管理 通用性和易用性 UEF大内存管理的实现与使用 标准动态内存管理 缺点和不足 UEF大内存管理的实现与使用 标准动态内存管理 缺点和不足 内存碎片(Fragment) UEF大内存管理的实现与使用 什么是内存碎片 UEF大内存管理的实现与使用 什么是内存碎片 反复随机分配和释放之后,形成的空洞,导致动态内存利用率降低。 UEF大内存管理的实现与使用 内存碎片的形成原因 UEF大内存管理的实现与使用 内存碎片的形成原因 UEF大内存管理的实现与使用 内存碎片的形成原因 总未分配空间=2+3+5+100=110KB 最大可分配空间=100KB UEF大内存管理的实现与使用 内存碎片的形成原因 大量尺寸不一的对象 对象的分配和释放是随机发生的 计算机的内存是线性排列的,并且通过指针访问动态内存。 UEF大内存管理的实现与使用 克服内存碎片的方法 夯实(Compaction) UEF大内存管理的实现与使用 什么是夯实 通过移动已分配的对象,使对象成线性排列,可以取回碎片造成的内存空间缺失。 UEF大内存管理的实现与使用 夯实的效果 UEF大内存管理的实现与使用 夯实的效果 UEF大内存管理的实现与使用 已知应用 Palm OS Macintosh OS Lisp, Java, Smalltalk UEF大内存管理的实现与使用 UEF中的实现 UEF大内存管理的实现与使用 UEF中的实现 技术要求 易用性 安全性 快速整理 快速访问 UEF大内存管理的实现与使用 UEF中的实现 句柄分配 句柄是一个内存块的代理对象,内存的使用者和句柄交互,而实际的内存资源由句柄管理和维护。 UEF大内存管理的实现与使用 UEF中的实现 句柄解决的问题 当内存块发生移动后,句柄维护的指针指向新的地址,而用户可以通过句柄存取正确的内存。 UEF大内存管理的实现与使用 UEF中的实现 对象表 用于管理句柄的查找表,支持随机访问 简单的线性表实现 UEF大内存管理的实现与使用 UEF中的实现 存取方法 直接使用指针访问,比每次都通过句柄间接访问要更快速,也更方便。 例如可以使用memcpy等直接操作内存的函数。 UEF大内存管理的实现与使用 UEF中的实现 安全存取 使用指针访问的过程中,可能发生碎片整理过程,导致指针无效。 UEF大内存管理的实现与使用 UEF中的实现 安全存取 使用指针访问的过程中,可能发生碎片整理过程,导致指针无效。 UEF大内存管理的实现与使用 UEF中的实现 锁定句柄 当一个句柄锁定之后,碎片整理会跳过对该句柄使用的内存块的移动。 UEF大内存管理的实现与使用 UEF中的实现 自适应碎片整理策略 根据碎片率自动选用不同的整理策略。 UEF大内存管理的实现与使用 UEF中的实现 自适应碎片整理策略 注:当分配失败时,顺序整理直到足够分配 策略是封闭的,但是在内部可以继续演变 UEF大内存管理的实现与使用 UEF中的实现 多任务考虑 目前的实现中没有考虑对多任务的支持,包括分配、释放和整理之间的互斥操作。可以通过简单的增加一组C API封装提供原子级分配、释放和整理操作。 整理是相对耗时的操作,如果可以提供更细粒度的并发操作更好,目前没有方案。 UEF大内存管理的实现与使用 UEF中的实现 使用方法 UEF大内存管理的实现与使用 UEF中的实现 使用方法 C风格API 分配: void lalloc(UBufferHandler* handler, size_t size) 释放: void lfree(UBufferHandler* handler) UEF大内存管理的实现与使用 UEF中的实现 使用方法 C风格API 分配: void lalloc(UBuffe

文档评论(0)

fc86033 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档