slab源码分析--销毁函数.doc

slab源码分析--销毁函数.doc

ID:48211285

大小:86.50 KB

页数:11页

时间:2020-01-22

slab源码分析--销毁函数.doc_第1页
slab源码分析--销毁函数.doc_第2页
slab源码分析--销毁函数.doc_第3页
slab源码分析--销毁函数.doc_第4页
slab源码分析--销毁函数.doc_第5页
资源描述:

《slab源码分析--销毁函数.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、slab源码分析--销毁函数释放对象注意释放对象仅仅是回收回slab,并不会将内存还给伙伴系统。回收对象时有以下原则:本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存。本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到本地共享缓存shared中,如果没有设置本地共享缓存,那么就转移到slab三链中。转移时基于先进先出原则的,也就是转移entry数组最前面的batchcount个空闲对象,因为这些对象在数组中存在的时间相对较长,为“冷数据”,不大可能仍然驻留在CPU

2、高速缓存中。释放对象比如调用://底层调用__cache_free()函数__cache_free(cachep,objp);那么释放对象就正式开始了,首先是__cache_free()函数,在该函数中首先确定ac有没有超过上限,如果没有超过上限,那就把该对象放入ac即可。否则,就按照batchcount转移出ac一大批对象,为这一个对象腾地方(一大批为一个,这样效率高一些,免得以后再转移)。/**Releaseanobjbacktoitscache.Iftheobjhasaconstructedstate,

3、itmust*beinthisstate_before_itisreleased.Calledwithdisabledints.*///回收函数staticinlinevoid__cache_free(structkmem_cache*cachep,void*objp){//获得本CPU的本地缓存structarray_cache*ac=cpu_cache_get(cachep);check_irq_off();objp=cache_free_debugcheck(cachep,objp,__builtin_

4、return_address(0));//NUMA相关,目前版本是空函数if(cache_free_alien(cachep,objp))return;//下面开始选择释放位置进行释放//本地缓存中的空闲对象小于上限时,只需将对象释放回entry数组中if(likely(ac->availlimit)){STATS_INC_FREEHIT(cachep);ac->entry[ac->avail++]=objp;return;}else{//这是本地缓存空闲对象大于上限的情况,先调整本地缓存STATS

5、_INC_FREEMISS(cachep);cache_flusharray(cachep,ac);//不过之后还是要把该对象释放给本地缓存ac->entry[ac->avail++]=objp;}}再看cache_flusharray()函数:staticvoidcache_flusharray(structkmem_cache*cachep,structarray_cache*ac){intbatchcount;structkmem_list3*l3;intnode=numa_node_id();//本地

6、缓存能一次转出多少个对象,这个是之前规定的batchcount=ac->batchcount;#ifDEBUGBUG_ON(!batchcount

7、

8、batchcount>ac->avail);#endifcheck_irq_off();//获得此缓存器的三链l3=cachep->nodelists[node];spin_lock(&l3->list_lock);//看是否存在本地共享缓存if(l3->shared){structarray_cache*shared_array=l3->shared;//本地

9、共享缓存还可承载的最大数目intmax=shared_array->limit-shared_array->avail;if(max){//最大只能为maxif(batchcount>max)batchcount=max;//将本地缓存前面的几个对象转入本地共享缓存中,因为前面的是最早不用的memcpy(&(shared_array->entry[shared_array->avail]),ac->entry,sizeof(void*)*batchcount);//更新本地共享缓存shared_array->

10、avail+=batchcount;gotofree_done;}}//没有配置本地共享缓存,只能释放对象到三链中//注意此时的batchcount就是原始的batchcount,也就是说可以把达到本地缓存一次性转出batchcount的目标//而上面的本地共享缓存如果使用的话,有可能达不到这个目标,因为它也有limit//不过即便达不到,由于本地共享缓存效率比三链高,这种情况也不会在到三链来,而是

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。