最近一直在学习ACE在内存方面的资料,可以看了无数回,都记不住而且每次看都有点晕,现在我把有关自己的一些理解贴上来,希望对大家有些帮助。
首先我们要理解几个概念:分配器、内存池
分配器:就是分配内存的方式,在C++中我们使用的是new,malloc等操作符,分配器就有点new和malloc的意思。ACE提供的很多丰富数据分配方式后面我会进行讲述一些ACE的分配方式
内存池:我们都知道在C++中我们使用new或malloc时候就是想系统提交一个需要内存的申请,系统根据情况会给我分配需要的空间,在一般的应用下是没有问题,但是如果我们频繁快速的申请和释放就会带来一个效率问题,这个时候我们就需要一个内存池,一次性申请非常多的内存供程序使用。这个时候问题就来了,我们怎么把这些内存给程序中使用了,这个时候ACE的分配器就起作用了。

总体而言:内存池申请一大块内存区域,而分配器来管理内存池的区域分配与回收。这样我们就减少了系统分配释放内存的次数,同时这种做法也可以避免内存泄漏。

分配器:

ACE_Allocator 
ACE中的分配器类的接口类。这些类使用继承和动态绑定来提供灵活性。

ACE_Static_Allocator 
该分配器管理固定大小的内存。每当收到分配内存的请求时,它就移动内部指针、以返回内存chunk(“大块”)。它还假定内存一旦被分配,就再也不会被释放。

ACE_Cached_Allocator 
该分配器预先分配内存池,其中含有特定数目和大小的内存chunk。这些chunk在内部空闲表(free list)中进行维护,并在收到内存请求(malloc())时被返回。当应用调用free()时,chunk被归还到内部空闲表、而不是OS中。

ACE_New_Allocator 
为C++ new和delete操作符提供包装的分配器,也就是,它在内部使用new和delete操作符,以满足动态内存请求。

内存池
ACE_MMAP_Memory_Pool       基于内存映射的内存池 
ACE_Lite_MMAP_Memory_Pool  基于内存映射文件的内存池的轻量级版本 
ACE_Shared_Memory_Pool     基于System V共享内存的内存池 
ACE_Local_Memory_Pool      基于C++new操作的内存池 
ACE_Pagefile_Memory_Pool   基于从windows页面文件分配的匿名内存区内存池 
ACE_Sbrk_Memory_Pool       基于sbrk(2)的内存池 

下面我们通过一些简单的代码来说明分配器和内存池的使用

ACE_Cached_Allocator 的使用:

int _tmain(int argc, _TCHAR* argv[])
{

// 申明一个数组类型
 typedef char MEMORY_BLOCK[1024];

//申明分配器 使用MEMORY_BLOCK的意思就是 ACE_Cached_Allocator中每一个chunk的长度为1024个字节
 typedef ACE_Cached_Allocator<MEMORY_BLOCK, ACE_SYNCH_MUTEX> Allocator;

 Allocator allocator_(10);
 char* mesg_array_ = (char*)allocator_.malloc(1025); // 如果我们需要的内存大于每个chunk 那么就会分配失败 这句话的执行结果就是mesg_array_ == NULL
 char* mesg_array1 = (char*)allocator_.malloc(100); // 分配成功
 allocator_.free(mesg_array1); //释放mesg_array1的内存,实际上内存并没有释放的OS,而是还停留在allocator_.中,如果有兴趣你可以看看ACE的源代码
 getchar();
 return 0;
}
从上面的DEMO我们可以看出ACE_Cached_Allocator 实际上也是一种内存池,但是我们把它叫做分配器

下面我们来说明内存池的使用:
内存池一般我们与ACE_MALLOC和 ACE_Allocator_Adapter配合使用
typedef  ACE_Malloc<ACE_LOCAL_MEMORY_POOL, ACE_SYNCH_MUTEX> MUTEX_MALLOC;
typedef ACE_Allocator_Adapter<MUTEX_MALLOC> Mutex_Allocator;
那么我们操作Mutex_Allocator就跟操作分配一样。通过malloc和free来分配释放内存
int _tmain(int argc, _TCHAR* argv[])
{

 typedef  ACE_Malloc<ACE_LOCAL_MEMORY_POOL, ACE_SYNCH_MUTEX> MUTEX_MALLOC;
 typedef ACE_Allocator_Adapter<MUTEX_MALLOC> Mutex_Allocator;

Mutex_Allocator allocator_;
 char* mesg_array_ = (char*)allocator_.malloc(1025); // 分配成功
 char* mesg_array1 = (char*)allocator_.malloc(100); // 分配成功
 allocator_.free(mesg_array1); //释放mesg_array1的内存
 getchar();
 return 0;
}
关于内存池我也只懂的如何应用可是我还是不知道,里面内部的实现机制,就我个人理解而言,ACE的内存池主要还是为了满足进程间共享内存过两天我会把这方面的代码贴出来。

posted on 2011-04-14 22:56 arrow8209 阅读(1280) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


统计