内存管理方案

时间:2021-07-06 08:37:29

内存管理方案
Memory Management System

Author: Owen

目 录
内存管理方案 1
目 录 1
1 概述 2
2 理论依据 2
2.1 不对内存进行管理 2
2.2 对内存进行内部管理: 2
3 实现方案 2
3.1 增加类名属性,用于管理登记 2
3.2 增加自创建,自销毁函数,统一管理 3
3.3 MMS管理单例 3
3.4 MMS临界变量 3
3.5 MMS接口概述 3
3.6 模式优化 6
3.7 引用相关实例 6
3.8 其他建议 7

1 概述
内存优化的方案主要是为了减少应用程序对系统内存的频繁申请释放,减少应用程序运行中的内存管理负担。可以提高系统整体的性能,而非单独应用程序。
2 理论依据
2.1 不对内存进行管理
优势: 开发人员不需要管理内存,使用可以根据需要,无需过多操作。
弊端: 内存的申请释放,对系统而言,需要做一系列的操作,比如:内存页表的修改,内存碎片重组等。如果频繁申请释放同类资源,会造成系统资源的浪费。
2.2 对内存进行内部管理:
优势: 为了减少内存的申请释放,应用程序可以记忆每次需要释放的内存块,并且再下次使用时可以直接使用,使得内存使用稳定在一定的范围内,减少系统资源的重复消耗。
弊端: 减少系统申请释放内存的开销,也增加了少量的逻辑运算,管理方案的维护。
需要对需要管理的类,做少量修改。比如 增加类名属性

3 实现方案
方案概述:
[概括为: 工厂模式] 应用程序使用内存管理单例,托管的类需要先注册名称和创建函数,需要申请某个类型的内存时,直接在对应的空闲链表中获取一个[获取函数会在返回前,清空内存块],如果不存在,则申请一个新的。在释放某个类型的内存时,将该内存指针插入空闲链表即可。
3.1 增加类名属性,用于管理登记
“仿MFC机制:

DEFINE _IMPLEMENT_RUNTIMECLASS(CLASS_NAME, BASE_CLASS_NAME,WSCHEMA,PFNNEW) \

STATIC CHAR _LPSZ##CLASS_NAME[] = #CLASS_NAME; \
CRUNTIMECLASS CLASS_NAME::CLASS##CLASS_NAME = { \
_LPSZ##CLASS_NAME, SIZEOF(CLASS_NAME), WSCHEMA, PFNNEW, \
RUNTIME_CLASS(BASE_CLASS_NAME), NULL }; \
STATIC AFX_CLASSINIT INIT##CLASS_NAME(&CLASS_NAME::CLASS##CLASS_NAME); \
CRUNTIMECLASS* CLASS_NAME::GETRUNTIMECLASS() CONST \
{ RETURN &CLASS_NAME::CLASS##CLASS_NAME; } \”
3.2 增加自创建,自销毁函数,统一管理
此处可以考虑智能指针, 或从根类继承
Create();
{
Return new ClassA();
}
Destroy();
{
Delete this;
}
3.3 MMS管理单例

使用单例模式,建立内存管理系统[简称MMS]
3.4 MMS临界变量
支持多线程处理。
MMS配置一个临界变量,用于确保链表头数据安全
每个链表头配置一个临界变量,用于确保链表数据安全
3.5 MMS接口概述
3.5.1 托管类注册
CMMS *pMMS=CMMS::GetInstance();
pMMS->Register(ClassA.classname,&ClassA.Create);
void Register(…)
{
AutoLock(&m_lock);
m_mapClassCreator[ClassA.classname]= &ClassA.Create;
}
3.5.2 托管类对象获取
ClassA *pA= pMMS->AllocateClassMemory(ClassA.classname);
Typedef list