inode生命周期

1.添加inode到inode cache链表

当inode的引用计数器i_count为0后,会调用iput_final去释放

static void iput_final(struct inode *inode)
{struct super_block *sb = inode->i_sb;const struct super_operations *op = inode->i_sb->s_op;unsigned long state;int drop;WARN_ON(inode->i_state & I_NEW);if (op->drop_inode)drop = op->drop_inode(inode);elsedrop = generic_drop_inode(inode);//引用计数为0之后,将inode放到lru中,等待回收if (!drop &&!(inode->i_state & I_DONTCACHE) &&(sb->s_flags & SB_ACTIVE)) {inode_add_lru(inode);spin_unlock(&inode->i_lock);return;}//对于已经被文件系统除名的文件,即i_nlink = 0, 不必再保留inode,直接释放掉WRITE_ONCE(inode->i_state, state | I_FREEING);if (!list_empty(&inode->i_lru))inode_lru_list_del(inode);spin_unlock(&inode->i_lock);evict(inode);
}

2.从inode cache中删除inode

在系统需要回收内存时,就会对这个链表下手,回收最近最少使用的inode。

long prune_icache_sb(struct super_block *sb, struct shrink_control *sc)
{LIST_HEAD(freeable);long freed;//遍历超级块的s_inode_lru链表,按照回收控制结构sc指定的回收数量,//将可回收的inode隔离到freeable链表中集中回收freed = list_lru_shrink_walk(&sb->s_inode_lru, sc,inode_lru_isolate, &freeable);//将隔离出来的inode进行回收,这样隔离后可以避免锁竞争dispose_list(&freeable);return freed;
}
static void dispose_list(struct list_head *head)
{while (!list_empty(head)) {struct inode *inode;inode = list_first_entry(head, struct inode, i_lru);//将inode从超级块的s_inode_lru链表摘除list_del_init(&inode->i_lru);//回收inodeevict(inode);cond_resched();}
}static void evict(struct inode *inode)
{const struct super_operations *op = inode->i_sb->s_op;BUG_ON(!(inode->i_state & I_FREEING));BUG_ON(!list_empty(&inode->i_lru));//从bdi_writeback的b_io链表摘除if (!list_empty(&inode->i_io_list))inode_io_list_del(inode);//将inode从超级块的s_inodes链表摘除inode_sb_list_del(inode);//等待该inode回写完毕inode_wait_for_writeback(inode);//调用对应文件系统的evict_inode方法,回写pagecacheif (op->evict_inode) {op->evict_inode(inode);} else {truncate_inode_pages_final(&inode->i_data);clear_inode(inode);}//如果是块设备inodeif (S_ISBLK(inode->i_mode) && inode->i_bdev)bd_forget(inode);//如果是字符型设备if (S_ISCHR(inode->i_mode) && inode->i_cdev)cd_forget(inode);//从全局inode哈希表中摘除remove_inode_hash(inode);...//回收inodedestroy_inode(inode);
}

处理完这些引用后,就可以调用destroy_inode回收到slab缓存,对于ext4,调用的是ext4_destroy_inode

static void destroy_inode(struct inode *inode)
{BUG_ON(!list_empty(&inode->i_lru));__destroy_inode(inode);//调用对应文件系统的destroy_inode方法,将inode回收到slab缓存//对于ext4,调用的是ext4_destroy_inodeif (inode->i_sb->s_op->destroy_inode)inode->i_sb->s_op->destroy_inode(inode);elsecall_rcu(&inode->i_rcu, i_callback);
}static void ext4_destroy_inode(struct inode *inode)
{	if (!list_empty(&(EXT4_I(inode)->i_orphan))) {...}//调用ext4_i_callback将inode释放会slab缓存call_rcu(&inode->i_rcu, ext4_i_callback);
}static void ext4_i_callback(struct rcu_head *head)
{struct inode *inode = container_of(head, struct inode, i_rcu);//释放回slab缓存kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
}

3.记忆

  • 等待回收:iput_final会把i_count为0的inode放入superblock的LRU链表s_inode_lru【这个链表也称为inode cache】中(inode_lru_list_add函数)
  • 正式回收:回收链表s_inode_lru中的节点,大致调用栈:evict->destroy_inode -> ext4_destroy_inode -> ext4_i_callback(释放slab缓存)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PaddleNLP的简单使用

1 介绍 PaddleNLP是一个基于PaddlePaddle深度学习平台的自然语言处理(NLP)工具库。 它提供了一系列用于文本处理、文本分类、情感分析、文本生成等任务的预训练模型、模型组件和工具函数。 PaddleNLP有统一的应用范式:通过 paddlenlp.Task…

数据结构-数组(详细讲解)

文章目录 数组数组的概述数组的图示一维数组二维数组 数组的定义一维数组的定义二维数组的定义 数组的取值赋值一维数组二维数组 数组的操作一维数组的操作索引实现指针实现 二位数组的操作矩阵转三元组矩阵的乘法 数组 数组的概述 概述:数组是一种线性数据结构&a…

代码随想录算法训练营第三十三天|860. 柠檬水找零

860. 柠檬水找零 public static boolean lemonadeChange(int[] bills) {if (bills.length 0) {return true;}if (bills[0] > 5) {return false;}int fiveNum 0;int tenNum 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {fiveNum;continue;}if (bills[i]…

导入表注入(iathook)

头文件&#xff08;hookMain.h&#xff09;内容 #pragma once #include<Windows.h>DWORD* g_iatAddr NULL; DWORD* g_unHookAddr NULL;BOOL InstallHook(); //安装钩子 BOOL UninstallHook(); //卸载钩子 DWORD* GetIatAddr(const char* dllName, const char* dllFunc…

【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1

还是换用了vs2019 构建官方的m98代码打开gn生成的sln 工程 随便点击一个工程turnserver 构建,结果会触发全部构建turnserver构建日志 :构建了整个webrtc ts(1665,8): note: result_of<webrtc::TimeDelta ((lambda at ../../video/adaptation/overuse_frame_detector.cc:55…

C#设置程序开机启动

1&#xff1a;获取当前用户&#xff1a; System.Security.Principal.WindowsIdentity identity System.Security.Principal.WindowsIdentity.GetCurrent();System.Security.Principal.WindowsPrincipal principal new System.Security.Principal.WindowsPrincipal(identity);…

C# 使用WMI监听进程的启动和关闭

写在前面 Windows Management Instrumentation&#xff08;WMI&#xff09;是用于管理基于 Windows 操作系统的数据和操作的基础结构。具体的API可以查看 WMI编程手册。 WMIC 是WMI的命令行管理工具&#xff0c;使用 WMIC&#xff0c;不但可以管理本地计算机&#xff0c;还可…

粒子群算法求解港口泊位调度问题(MATLAB代码)

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;它通过模拟鸟群或鱼群的行为来寻找最优解。在泊位调度问题中&#xff0c;目标是最小化所有船只在港时间的总和&#xff0c;而PSO算法可以帮助我们找到一…

LarkXR功能更新:引入浏览器原生H265支持

Paraverse平行云自主研发的LarkXR&#xff0c;在CloudXR领域实现了重大突破&#xff0c;为XR云平台的商业化和技术进步树立了新标准。LarkXR通过其分钟级部署大规模云端资源和对所有主流XR引擎的高适配性&#xff0c;成功地解决了Cloud XR商业化过程中的多项挑战。这一创新不仅…

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果 二、遇到的问题 实现导出PDF主体代码参考&#xff1a;Java纯代码实现导出PDF功能&#xff0c;下图是原作者实现的效果 导出报错Font STSong-Light with UniGB-UCS2-H is not recognized.。参考&#xff1a;itext 生成 PDF(五) 使用外部字体 网上都是说jar包的版本…

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘

成功解决AttributeError: ‘str’ object has no attribute ‘decode’. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析及解决方案&#x1f333;&#x1f333;参考文章&#x1f333;&#x1f333;结尾&#x1f333; &#x1f333;引…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

算法沉淀——前缀和(leetcode真题剖析)

算法沉淀——前缀和 01.一维前缀和02.二维前缀和03.寻找数组的中心下标04.除自身以外数组的乘积05.和为 K 的子数组06.和可被 K 整除的子数组07.连续数组08.矩阵区域和 前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和&#xf…

Redhat 8.4 一键安装 Oracle 11GR2 单机版

Oracle 一键安装脚本&#xff0c;演示 Redhat 8.4 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚本…

宝塔控制面板配置SSL证书实现网站HTTPS

宝塔安装SSL证书提前申请好SSL证书&#xff0c;如果还没有&#xff0c;先去Gworg里面申请&#xff0c;一般几分钟就可以下来&#xff0c;申请地址&#xff1a;首页-Gworg官方店-淘宝网 一、登录邮箱下载&#xff1a;Gworg证书文件目录 &#xff0c;都会有以下五个文件夹。宝塔…

ROS学习笔记11——ROS中的重名问题

一、ros功能包重名——ros工作空间覆盖 功能包重名时&#xff0c;会按照 ROS_PACKAGE_PATH 查找&#xff0c;在前的会优先执行。ROS 会解析 .bashrc 文件&#xff0c;并生成 ROS_PACKAGE_PATH ROS包路径&#xff0c;即调用功能包的顺序&#xff0c;该变量中按照 .bashrc 中配置…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十六)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面&#xff0c;出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插&#xff0c;但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后&#xff0c;鼠标移动到外面&#xff0c;键盘在英…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…