欢迎来到天天文库
浏览记录
ID:48211285
大小:86.50 KB
页数:11页
时间:2020-01-22
《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//不过即便达不到,由于本地共享缓存效率比三链高,这种情况也不会在到三链来,而是
此文档下载收益归作者所有