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函数的调用是在链表没有空间的条件下。