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异常。
- STL学习_SGI空间配置器
- STL学习_SGI二级空间配置器源码剖析
- STL学习_SGI空间配置器_第一级配置器源码分析
- STL学习(空间配置器)
- STL学习笔记之空间配置器
- STL学习笔记(三):空间配置器
- 【STL】STL空间配置器
- STL空间配置器
- STL空间配置器
- STL空间配置器
- 【STL】空间配置器
- STL空间配置器
- STL----空间配置器
- STL-空间配置器
- STL空间配置器
- STL空间配置器
- STL空间配置器
- STL空间配置器
- INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.NoRouteToHostException: No route
- hdu 1242 Rescue
- 我的Android进阶之旅------>解决Android Studio编译后安装apk报错:The APK file does not exist on disk
- 三.Hive数据分析与存储
- 有关ActiveMQ文件上传初探
- STL学习_SGI空间配置器
- android分辨率问题
- 【C#-Hashtable简单操作】
- android shape 使用
- 【B/S】利用AJAX实现分页
- 读书清单(2016-7-26)
- 可信执行环境
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
- javascript 的 继承(五) 之 寄生式继承