现在的位置: 首页 > 综合 > 正文

STL SGI内存的管理

2013年10月06日 ⁄ 综合 ⁄ 共 592字 ⁄ 字号 评论关闭

SGI中设计了双层配置器,第一层配置器直接使用malloc和free两个函数。第二层配置器则采用不同的方法。当客户请求的内存大于128bytes的时候,使用第一层配置器。

当小于或者等于128bytes的时候,使用第二层配置器。

第一层配置器直接使用malloc分配请求大小的space,并且返回。注意请求的时候,当请求的内存第一次不能使用malloc分配的时候,使用set_new_handler来处理错误的情况,再次使用while循环分配。具体细节看SGI源代码。

第二层配置器比较复杂,使用memory pool的方法管理内存。总共维护16个链表,管理的大小分别是8,16,、、、、128bytes的大小。

注意当申请的大小不是这样 的大小的时候,改变大小到合适的8的倍数。

list的结构定义:

union obj{

union obj *free_list_link;

char client[1];

}

我们理所当然的会想到,维护链表,需要不少的开销。我们使用union obj这个数据结构,其中第一个值是一个pointer,可以看做的链表中的next指针。第二个值可以看做是指向space的指针。

SGI里面存在chunk_alloc这个函数。主要是用来堆memory pool space的申请。当申请到的时候,根据客户的请求,连接到不同的链表当中。

chunk_alloc函数的调用是在链表没有空间的条件下。

抱歉!评论已关闭.