续上在这里我将要向大家简单介绍下游戏服务器中必须要处理另外项主要技术:
内存分配处理技术也可以称为内存池处理技术(这个比较洋气前面通俗好呵呵)
开始向大家介绍般情况下我们对于内存些基本操作简单而言内存操作就只有 3个步骤:申请、使用、销毁而对于这些操作我们在C和C中处理方式略有区别:
在C中我们般用malloc(….)来进行申请而对应销毁已经申请内存使用free(…)
在C我们般使用操作符和delete操作符进行处理申请和销毁
大家定要问了我们般都是这样处理呀!!没有什么可以说哦!!呵呵我感觉就有还是有些东东和大家聊哦先聊简单几条吧!!
1.Malloc(…..)和free(….), ….和 delete …必须成对出现不可以混杂哦混杂话后果就不可以想了哦!!(也没有什么就是内存被泄漏了呵呵)
2.在我们使用 …和delete ….定要注意些细节否则后果同上哦!!什么细节呢?下面看个简单例子:
char *block_memory = NULL;
block_memory = char[1024];
delete block_memory;
block_memory = NULL;
大家沉思会
大家看有错吗?没有错吧!!
如果说没有错就要好好补补课了是有错上面实际申请内存是没有完全被释放为什么呢?大家没有注意第条完全匹配原则哦在 时候有[ ]我们在delete 如何就没有看见[ ] 影子呢? 这就造成了大错有1023个字节没有被释放正确是 : delete block_memory;
有关内存基本操作我是说这两条其他要注意还是有基本就源于此了
了解了上面那些接下来就想大家说说服务器内存处理技术了上面都没有弄清楚了就算了呵呵
大家都知道我们服务器要频繁响应客户端消息同时要将消息发送到客户端并且还要处理服务器后台游戏World运行这样我们就必须要大量使用内存并且要进行大量内存操作(申请和销毁)而在这样操作中我们还必须要保证我们绝对正确无误否则就会造成内存泄漏而内存泄漏对于服务器而言是非常可怕也可能就是我们服务器设计失败毒药而我们如何进行服务器内存正确和合理管理呢?那就是我们
必须建立套适合我们自己内存管理技术现在就向大家说说我在内存管理方面些做法
基本原理先用图形表示下:
\" width=499 border=0>
上面意思是:我们在服务器启动过程中就为自己申请块比较大内存块而我们在服务器运行过程中需要使用内存我们就到这样块比较大已经申请好内存块中去取而使用完后要进行回收原理就是这么简单而最重要是我们如何管理这个大内存块呢?
(非常复杂也比较难呵呵)
首先 就内存块操作而言就只有申请(类似 )和回收(类似 delete)
其次 我们必须要清楚那些内存我们在使用中那些是可以申请
有关上面我简单将这样些数据结构和定义在下面供大家参考使用
typedef struct MemoryBlock //内存块结构
{
void *buffer; //内存块指针
b_Size; //内存块尺寸
} MemoryBlock;
CMemoryList //列表对象类(相当于管理类)
{
public:
CMemoryList;
virtual ~ CMemoryList;
void InitList( data_size, data_num);//化列表数据结构尺寸和数量
void AddToList(void *data); //加入列表中
void DeleteItem( index); //删除指定索引元素
……………..
private:
void Init;
void Release;
private:
void *memory;
total_size;
total_num;
protected:
};
s CMemoryPool //内存池处理类
{
public:
CMemoryPool;
virtual ~ CMemoryPool;
bool InitMemoryPool( size); //化内存池
void * ApplicationMemory( size); //申请指定size内存
void CallBackMemory(void *, size); //回收指定size内存
private:
void Init;
void Release:
MemoryBlock *UniteMemory(MemoryBlock *block_aMemoryBlock * block_b); //合并内存
private:
MemoryBlock memoryPool_Block; //内存池块
CMemoryList *callBackMemory_List; //回收内存列表
CMemoryList *usingMemory_List; //使用中内存列表
CMemoryList *spacingMemory_List; //空白内存列表
protected:
};
以上就是这个内存管理类些基本操作和数据定义 CMemoryList 在这里不是重点暂且就不说了有空再聊而具体内存池处理思路方法简单叙述如下:
InitMemoryPool(): 化申请块超大内存
ApplicationMemory():申请指定尺寸申请内存成功后要将成功申请内存及其尺寸标示到usingMemory_List列表同时要将spacingMemory_List列表进行重新分配以便于正确管理
CallBackMemory():回收指定尺寸内存成功回收后要修改spacingMemory_List列表同时如果有相邻内存块就要合并成个大内存块usingMemory_List修改使用列表要在使用列表中这项删除
以上就是些简单处理介绍说明更加详细就需要大家自己琢磨和处理了我就不细说了呵呵不足的处就请大家进行指正以便让我们大家都提高先谢谢了
QQ : 81556019
MSG : [email protected]
最新评论