STL学习_SGI空间配置器

来源:互联网 发布:appche 转发 node 编辑:程序博客网 时间:2024/06/15 09:07

STL的六大组件:(1)容器:containers  (2)算法:algorithms (3)迭代器:iterator (4)仿函数:functors

                            (5)配接器:adapters (6)配置器:allocators

STL六大组件的交互关系:配置器是幕后奉献者,用来分配空间,算法通过迭代器来进行容器内容的存取等操作,仿函  数协作算法完成不同的策略的变化,算法可以修饰或套接仿函数。


这里自己总结了些空间配置器怎样进行内存的申请

SGI空间配置器分为一级,二级配置器,彼此之间合作完成空间的申请。一级配置器直接使用malloc() free()对空间进行申请和释放,二级配置器采用memory pool(内存池)的管理方式。

    内存申请的步骤:(1)客户申请的空间大于128bytes用一级配置器进行空间的分配,申请的空间小于128bytes用

二级配置器进行空间的分配

                                (2)例如客户申请的空间为n(n <= 128bytes)则系统会调用ROUND_UP( )函数使客户申请的空间上调至8的倍数例如为Nbytes,然后利用FREELIST_INDEX( )函数找到与之相对应的free list,例如为free_list[x],查看free_list[x]所指向的自由链表有没有可以利用的空间,如果有则在自由链表里面拔出一块Nbytes区块,则空间申请成,如果自由链表没有可利用的空间,则在在内存池中利用refill( )函数为free list重新填充空间,chunl_alloc( )函数在内存池中取得20个Nbytes的新区块,取出一块给客户,其余的19块由free_list[x]管理。但是如果内存池中空间的大小不足提供20个Nbytes的区块,但是足够供应一个以上的Nbytes的区块,则从内存池中拨出这不足20个区块的空间出去,分配一个区块给客户,剩下的由free_list[x]管理。又如果内存池的空间大小连一个区块空间都无法供应,则系统要要调用一级配置器利用malloc( )函数从heap中重新去申请一块空间,空间的大小为40+n(附加量)个Nbytes大小的区块,第一块给客户,其余的19块由free_list[x]管理,剩下的20块留给内存池。

                               (3)如果客户又申请空间,但是此时整个系统的heap都没有足够的空间可供客户申请,则系统就会遍历所有的free lists自由链表寻找有没有大于或等于Nbytes的空间,如果没有,则调用一级配置器,因为一级配置器有out_of_memory处理机制,或许有机会释放其他的内存拿来给此处使用,否则,发出bad_alloc异常。


如果感到难以理解下面举个例子说明一下

    如下图,SGI二级配置器有16个free_lists自由链表,各自管理的空间大小为8,16,24,32,48,48,56,64,72,80,88,96,104,112,120,128bytes的小额区块。

    1。如果客户申请32bytes大小的空间,32 <=128则系统调用二级空间配置器,从free_list[3]中找相应大小的空间,没有空间,系统调用一级空间配置器利用malloc( )申请一块大小为40+n(附加量)个32bytes的区块,将第一块给客户,其余的19块由free_list[3]管理,剩余的20个区块留给内存池。

    2.客户又要申请64bytes大小的空间,系统查free_list[7]下面有没有可用的自由链表,没有,则系统查看有没有可用的内存池,发现还有20 * 32bytes大小的内存池空间,但是这些空间不能够供应默认的20块区块,(通过

(20 *32)/ 64 = 10计算出来的),但是可以提供10个区块,则把这10个区块返回,第一个给客户,剩下的由free_list[7]管理。

    3.如果客户又要申请90bytes大小的空间,系统会将90bytes自动上调至8的倍数即96bytes空间的大小,调用二级空间配置器查看free_list[11]下面有没有可用的自由链表,没有,则二级配置器查看有没有可用的内存池空间,发现没有,则系统调用一级空间配置申请一块新的空间区块,区块大小为40+n个96bytes的区块,将第一个给客户,其余的19块由free_list[11]管理,剩下的20块留给内存池。如果整个系统的heap都没有可以分配的空间了,则系统就会遍历所有的free lists自由链表寻找有没有大于或等于Nbytes的空间,如果没有,则调用一级配置器,因为一级配置器有out_of_memory处理机制,或许有机会释放其他的内存拿来给此处使用,否则,发出bad_alloc异常。


                                          

0 0
原创粉丝点击