linux内核原理--页高速缓存,回写,页框回收

2024-02-25 11:12

本文主要是介绍linux内核原理--页高速缓存,回写,页框回收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.页高速缓存
我们主要分析下磁盘文件的页高速缓存

struct address_space {struct inode		*host;	struct radix_tree_root	page_tree;	spinlock_t		tree_lock;unsigned int		i_mmap_writable;struct prio_tree_root	i_mmap;	struct list_head	i_mmap_nonlinear;spinlock_t		i_mmap_lock;	unsigned int		truncate_count;	unsigned long		nrpages;pgoff_t			writeback_index;struct address_space_operations *a_ops;unsigned long		flags;	struct backing_dev_info *backing_dev_info;spinlock_t		private_lock;struct list_head	private_list;	struct address_space	*assoc_mapping;
} __attribute__((aligned(sizeof(long))));

页高速缓存通过上述结构实现.
每个磁盘文件拥有一个address_spacepage_tree是一个页框容器.容器内每个页框均存储了来自关联文件指定偏移下的一页数据.
i_mmap是一个vma容器.容器内每个vma均是针对此文件某个区域的一个vma
i_mmap_nonlinear是一个vma容器.容器内每个vma采用非线性映射的方式和此文件建立映射.
a_ops用于提供一组操作集合.以便实现内存,后备存储器两者间的数据交互.

page_tree是一颗多叉树,叶子节点是代表一个页框的page指针.linux下每个节点一般的分叉数是64
根据文件尺寸,我们可以计算文件页框数.根据文件页框数可以为其构建这样一颗多叉树,来快速定位指定文件指定页框的page对象.
在这里插入图片描述

假设基树的分叉是,那么对于一个文件尺寸在页框[5, 16]之间的文件对象而言,它的基树高度是2.利用基树可快速查找文件指定偏移的页框是否已经存在于基树中.

文件对象页高速缓存中的每个页框均位于文件对象的基树内.对于文件中页高速缓存中没缓存的页框,基树中叶子节点相应槽内容为null.针对节点所有槽均为null的节点,一般节点会直接移除.相应的上层节点对于槽位置将为null
在这里插入图片描述
上述是文件尺寸在页框[5, 16]之间的文件对象只有页框0,1,2,3位于页高速缓存时其基树的情况示意图.

有了页高速缓存,对文件的读,写,均先通过页高速缓存,这有助于减少和磁盘的直接交互次数.提升IO效率.
页高速缓存下,还搭配预读机制,以便进一步提升缓存命中率,提升IO效率.

2.回写
通过文件映射和页高速缓存我们可以读取文件数据,在内存中对其进行修改.
为了保证数据一致性,当文件页在内存被修改后,需要写会磁盘来同步.

linux提供了两种回写机制.
(1). 通过后台线程定时回写
后台线程定期运行,检测存在脏页时,对脏页执行回写处理.
(2). 通过系统调用显式请求数据同步
如通过fsyncfsyncdata来显式请求将文件在内存的脏页刷新到磁盘.

3.页框回收
为了应对物理内存有限下,系统需要分配新的物理内存而可能无法找到可用的空闲物理内存满足分配的场景.
系统需要页框回收机制.

(1). 通过将很少使用的部分物理内存页换出到块设备交换区,我们可以获得更多的空闲内存页.
值的注意的是内核自身使用的物理内存页不会被换出.
(2). 通过将标记为脏的文件映射页执行同步处理,我们可以直接释放这个页框.以便获得更多的空闲内存页.
(3). 通过直接释放非脏的文件映射页,我们可以获得更多的空闲内存页.

linux可以同时支持多个磁盘交换区,每个交换区可以基于硬盘分区实现,也可基于磁盘文件实现.
在交换区和物理页框之间,类似页高速缓存,存在交换高速缓存结构.

当某个属于匿名映射的物理页框由于页框回收需要写入交换区时,先将其加入相应交换区对象的交换高速缓存结构,在写入完毕后,再从交换高速缓存结构移除.

当某个共享的匿名映射页框由于页框回收需要写入交换区时,先将其加入相应交换区对象的交换高速缓存结构,利用反向映射修改每个使用该页框的页表项,使其指向交换区某位置.在写入完毕,且所有相关进程的页表项均修改完毕后,再从交换高速缓存结构移除.此后,某个进程再次访问此交换页,则需分配页框,页框加入交换高速缓存,执行从交换区读取数据填充页框的操作,在填充完成后,修改进程页表使其指向内存页.只有,所有相关进程均再次访问此交换页,且进程页表均被修改指向内存页后,才可将此页从交换高速缓存结构移除.

交换高速缓存存在的意义是:
每当进程访问某个线性地址,通过页表项获知对应页框位于交换区某位置时,可先尝试访问交换区对象的交换高速缓存,如访问到,则无需执行缓慢的磁盘io,直接修改进程页表指向交换缓存中页即可.只有交换缓存结构搜索不到,才需执行分配页框,页框添加到交换缓存,执行磁盘io来填充页框这样的流程.

指的注意的是:
交换区存在的意义在于配合页框回收,逻辑上扩大物理内存.
当换出页位于交换高速缓存期间,页框并未被释放,只有页框换出完成且页框从交换高速缓存结构移除后,页框才能被释放完成回收.

这篇关于linux内核原理--页高速缓存,回写,页框回收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745295

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分