本节介绍如何将对象释放回slub分配器。

kmem_cache_free

void kmem_cache_free(struct kmem_cache *s, void *x)

{

struct page *page;

/*获得对象所在slab的首页*/

page = virt_to_head_page(x);

/*释放一个对象给slab。_RET_IP_为调用函数地址*/

slab_free(s, page, x, _RET_IP_);

trace_kmem_cache_free(_RET_IP_, x);

}

slab_free

释放一个对象。

参数:

1)s:cache指针。

2)page:待释放对象所在slab的首页。

3)x:待释放对象指针

4)addr:最初调用函数的地址

static __always_inline void slab_free(struct kmem_cache *s,

struct page *page, void *x, unsigned long addr)

{

void **object = (void *)x;

struct kmem_cache_cpu *c;

unsigned long flags;

slab_free_hook(s, x);

local_irq_save(flags);

c = __this_cpu_ptr(s->cpu_slab);

slab_free_hook_irq(s, x);

if (likely(page == c->page && c->node != NUMA_NO_NODE)) {

/*如果对象所在slab即本cpu local slab,走快速路径,释放到cpu freelist中。与slab的freelist无关,参见__slab_alloc */

set_freepointer(s, object, c->freelist);

/*更新freelist指针,指向刚释放的对象*/

c->freelist = object;

stat(s, FREE_FASTPATH);

} else

/*慢速路径释放*/

__slab_free(s, page, x, addr);

local_irq_restore(flags);

}

__slab_free

待释放对象所在slab并不是本cpu的local slab时,走慢速路径释放,

static void __slab_free(struct kmem_cache *s, struct page *page,

void *x, unsigned long addr)

{

void *prior;

void **object = (void *)x;

stat(s, FREE_SLOWPATH);

slab_lock(page);

if (kmem_cache_debug(s))

goto debug;

checks_ok:

/*放回所在slab freelist的链表头部*/

prior = page->freelist;

/*待释放对象的下一对象指针指向原freelist */

set_freepointer(s, object, prior);

/* freelist指向待释放的对象*/

page->freelist = object;

/*已分配对象数减一*/

page->inuse--;

/* slab是否是冻结的。该slab有可能是其他cpu的local slab,这种情况下,不能执行后面的语句将local slab添加进部分满slab链*/

if (unlikely(PageSlubFrozen(page))) {

stat(s, FREE_FROZEN);

goto out_unlock;

}

/* inuse为0,又不是local slab,说明slab中全部是空闲对象,并且在部分满slab链表上(slab只有一个对象时,在满slab链上)。*/

if (unlikely(!page->inuse))

goto slab_empty;

/*

* Objects left in the slab. If it was not on the partial list before

* then add it.

*/

/*如果slab原本是满slab,现在释放了一个,加入部分满slab链*/

if (unlikely(!prior)) {

add_partial(get_node(s, page_to_nid(page)), page, 1);

stat(s, FREE_ADD_PARTIAL);

}

out_unlock:

slab_unlock(page);

return;

slab_empty:

if (prior) {

/*

* Slab still on the partial list.

*/

/* prior不为空时,说明slab在部分满slab链表上。prior为空时,说明slab只有一个对象,在满slab链上*/

remove_partial(s, page);

stat(s, FREE_REMOVE_PARTIAL);

}

slab_unlock(page);

stat(s, FREE_SLAB);

/*废除slab,slub没有空slab链,slab一旦为空,马上销毁。(这点与去解冻slab时不同,参见unfreeze_slab)*/

discard_slab(s, page);

return;

debug:

if (!free_debug_processing(s, page, x, addr))

goto out_unlock;

goto checks_ok;

}

linux vi 内存,Vi Linux内存 之 Slub分配器(四)相关推荐

  1. Linux内存管理slub分配器

    背景 Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 之前的文章分析的都是基于页面的内存分配,而小块 ...

  2. linux slub分配器,Vi Linux内存 之 Slub分配器(六)

    再来看内置式对象,如下图所示.指针位于对象的头部,与对象共用存储空间.这是因为对象被分配出去之前,其存储空间是空闲的可用状态,可用于存放空闲对象指针.对象被分配出去后,也不再需要这个指针了,可以被对象 ...

  3. 【Note4】网络,并发/IO,内存,linux/vi命令,正则,Hash,iNode,文件查找与读取

    文章目录 1.局域网:CSMA/CD 2.互联网:ARP,DHCP,NAT 3.TCP协议:telnet,tcpdump,syn/accept队列 4.HTTPS协议:摘要(sha.md5.crc). ...

  4. Linux内存管理:slub分配器

    概述: 我们知道内核中的物理内存由伙伴系统(buddy system)进行管理,它的分配粒度是以物理页帧(page)为单位的,但内核中有大量的数据结构只需要若干bytes的空间,倘若仍按页来分配,势必 ...

  5. 一文给你解决linux内存源码分析- SLUB分配器概述(超详细)

    SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于 ...

  6. linux内存分配机制,Linux内存分配机制:SLAB / SLUB / SLOB

    Linux内存分配机制:SLAB / SLUB / SLOB [日期:2011-07-15] 来源:Linux社区 作者:do2jiang [字体:大 中 小] slob: introduce the ...

  7. Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口

    Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...

  8. 32位linux 内存占用,LINUX内存高,触发OOM-KILLER问题解决

    最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂 1. 首先确认该系统的版本是32位 #uname -aLinux alarm 2.6.9-67.ELsmp #1 SMP  ...

  9. linux如何看分配固定共享内存段,Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

最新文章

  1. linux 检查权限,检查目录下 文件的权限-linux shell脚本,
  2. 国内C/C++刷题网站汇总
  3. js的apply方法使用详解,绝对NB
  4. SAP Spartacus Org Unit明细页面的设计原理
  5. mppt多峰追踪MATLAB仿真,基于光伏功率等效面积法的多峰最大功率追踪控制方法...
  6. c 语言银行排队系统,C++实现银行排队系统
  7. 【英语学习】【Level 08】U01 Let's Read L2 Of fairies and princesses
  8. Java 内存模型(零)
  9. 为什么系统调用会消耗较多资源?系统调用的三种方法:软件中断(分析过程)、SYSCALL指令、vDSO(虚拟动态链接对象linux-vdso.so.1)
  10. 服务目录-运维管理SLA服务
  11. python电力系统分析_PyPSA电力系统分析简介
  12. 在TCGA中查找mutation突变
  13. c语言mud游戏制作,MUD游戏制作工具下载
  14. 搜索引擎-应用篇(地理位置查询)
  15. TCP——粘包/拆包
  16. Mac系统输入英文时如何去掉自动提示
  17. 微信dat文件批量解密
  18. python 根据word生成ppt_python 生成 word、ppt 操作源码分享
  19. 小米手机拦截返回音设置不了_MIUI 12第二批稳定版已完成全量推送:你的手机支持吗...
  20. opencv python 把图(cv2下)BGR转RGB,且HWC转CHW

热门文章

  1. 大数据如何应用于食品追溯管理
  2. 如何才能在大数据中获取价值
  3. 大数据可视化如何实现
  4. 如何利用大数据做好数据分析
  5. 大数据分析体系由哪些层级构成
  6. 程序员须掌握的大数据分析核心技术
  7. 在 Eclipse 中进行 局部 、全局搜索
  8. 安卓蓝牙键盘切换输入法_Windows10添加中文美式键盘,传统语言栏,采用ctrl+shift切换输入法...
  9. 32蜂鸣器天空之城代码_stm32版蜂鸣器播放爱若琉璃
  10. python报表自动化系列 - 译码:将纯数字译码为Excel列坐标的字母索引表示形式