Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)

目录

一、缓存手段

二、Linux 页高速缓存

三、flusher 线程


Linux 内核实现了一个被叫做页高速缓存(page cache)的磁盘缓存,它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到内存中,把对磁盘的访问变为对物理内存的访问。

临时局部原理(temporal locality):如果在第一次访问数据时缓存它,那么就极有可能在短时间内再次访问到,因为程序内存在着循环;并且其相邻的数据也可能在短时间内被访问到,因为程序内存放的数据有很多是连续的(如数组)。

一、缓存手段

页高速缓存是由内存中的物理页组成的,其内容对应磁盘上的物理块。页高速缓存可以动态调整,它可以通过占用空闲内存以扩张大小,也可以自我收缩以缓解内存使用压力。

当进程发起一个 read() 系统调用,它会首先检查需要的数据是否在页高速缓存中,如果在则直接从内存中读取,而无需访问磁盘,此时缓存命中;如果没在缓存中,则内核必须调度块 I/O 操作从磁盘读取数据。

当进程发起一个 write() 系统调用时,缓存一般有三种策略:

  • 不缓存(no-write),这种策略不缓存任何写操作,写的时候直接写入磁盘,然后使缓存中对应数据失效。一般不使用这种策略。
  • 写透缓存(write-through cache),写操作会同时更新缓存和磁盘上的数据。这种策略对保持缓存一致性很有好处。
  • 回写(write-back),写操作会直接更新缓存中的数据,但不会立即更新磁盘上的数据,而是将页高速缓存中被写入的页面标记成 “脏页”,并且被加入到脏页链表中,然后由一个回写进程周期性将脏页链表中的页写回到磁盘。当脏页被换出缓存时,则需要立即回写该页。Linux 所采用的就是这种策略

当缓存满后,如何选择合适的页面换出是一种重要的工作,有如下两种策略:

  • 最近最少使用策略(LRU): LRU 回收策略需要跟踪每个页面的访问时间,以便能回收最老时间戳的页面(最少被使用的页面)。LRU 是通过维护一个按照时间为序的页链表来实现的。
  • 双链策略:Linux 采用的是一个修改过的 LRU,也叫双链策略。这种策略要维护两个链表,活跃链表和非活跃链表。处于活跃链表上的页面被认为是访问较多的且不会被换出,而在非活跃链表上的页面则是可以被换出的。这种双链方式也被称为 LRU/2。

二、Linux 页高速缓存

在页高速缓存中的页可能包含了多个不连续的物理磁盘块。Linux 页高速缓存使用了一个新对象管理缓存项和页 I/O 操作,这个对象是 address_space 结构体。文件可以有多个虚拟地址(可以被多个 vm_area_struct 结构体标识),但在物理内存只能有一份(只能有一个 address_space 结构体)。

三、flusher 线程

由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新的时候,该数据就被称作脏数据。在以下三种情况发生时,脏页被写回磁盘:

  • 当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘以释放内存。
  • 当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,以确保脏页不会无限期地驻留在内存中。
  • 当用户进程调用 sync() 和 fsync() 系统调用时,内核会按照要求执行回写操作。

在 2.6 内核中,由一群内核线程(flusher 线程)执行这三种操作。flusher 线程基于页面,它将整个脏页写回磁盘。

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Markdown 扩展语法练习

风无痕 August 26, 2023 Markdown 指南中文版 Markdown 入门指南Markdown 基本语法Markdown 扩展语法Markdown 基本语法练习Markdown 扩展语法练习 代码 <h3 id"table">表格</h3>| Syntax | Description | | --- | --- | | Header | Title | | Paragrap…

抖店商品怎么让达人带货?说下找达人技巧和寄样后的操作,可收藏

我是王路飞。 找达人带货的玩法是公认出单快、易爆单、长久稳定的出单方式。 虽然新手可能感觉要给达人佣金&#xff0c;自己利润会降低&#xff0c;但是这种玩法可以让你快速入门&#xff0c;且能长久玩下去。 尤其是现在抖音直播间的产品全都是来自抖音小店的&#xff0c;…

多线程基础篇

我们平常说的一个程序&#xff0c;一个程序中有声音&#xff0c;图片&#xff0c;字幕 实际上是一个进程中有多个线程 main线程是主线程。 多核&#xff0c;多个cpu&#xff0c;多个线程&#xff0c;切换的很快 单核的话是一个cpu,某一时间只能是一个线程&#xff0c;但是因为…

抢先体验|乐鑫推出 ESP32-S3-BOX-3 新一代开源 AIoT 开发套件

乐鑫科技 (688018.SH) 非常高兴地宣布其开发套件阵容的最新成员 ESP32-S3-BOX-3。这款完全开源的 AIoT 应用开发套件搭载乐鑫高性能 ESP32-S3 AI SoC&#xff0c;旨在突破传统开发板&#xff0c;成为新一代开发工具的引领者。 【乐鑫新品抢先体验】ESP32-S3-BOX-3 新一代开源 A…

WPF基础入门-Class3-WPF数据模板

WPF基础入门 Class3&#xff1a;WPF数据模板 1、先在cs文件中定义一些数据 public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code "Yellow", Name &qu…

数据库中的条件索引使用

数据库条件索引 在逻辑删除相关的表中&#xff0c;设置普通唯一索引在多个逻辑上已删除的元组中可能发生唯一性冲突&#xff0c;即不允许存在两个相同的已删除元组&#xff0c;同时在存在已删除元组时也不允许插入相同值的新元组。此时可以通过设置条件索引&#xff0c;使唯一…

PlantUML文本绘制类图

记录下文本绘制类图的语法 参考 https://juejin.cn/post/6844903731293585421 类的UML表示 使用UML表示一个类&#xff0c;主要由三部分组成。类名、属性、方法。其中属性和方法的访问修饰符用 - 、# 、 表示 private、protected、public。 如图所示&#xff0c;表示A类有一个…

【java】获取当前年份

目录 一、代码示例二、截图示例 一、代码示例 package com.learning;import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.Year; import java.util.Calendar; import java.util.Date;/*** 获取当前年份*/ public class GetCurrentYear {public …

苹果备货量创新高,潜望镜头立大功,iPhone 15 Pro Max备受瞩目

根据郭明锤的简讯内容&#xff0c;关于苹果公司未来发布的iPhone 15系列&#xff0c;有一些令人振奋的消息。据预测&#xff0c;苹果公司计划于下个月发布iPhone 15系列&#xff0c;其中最高配置的机型iPhone 15 Pro Max备货量预计将占整个系列的35%至40%&#xff0c;这一比例超…

46、基于51单片机的电子闹钟(DS1302)(程序+Protues仿真)

编号&#xff1a;46 基于51单片机的电子闹钟&#xff08;DS1302&#xff09; 功能描述&#xff1a; 本设计由51单片机最小系统DS1302时钟模块液晶1602显示模块键盘模块 1、主控制器是89C82单片机 2、DS1302获取时钟数据&#xff1b; 3、液晶1602显示年、月、日、时、分、秒、…

老Python程序员职业生涯感悟—写给正在迷茫的你

我来讲几个极其重要&#xff0c;但是大多数Python小白都在一直犯的思维错误吧&#xff01;如果你能早点了解清楚这些&#xff0c;会改变你的一生的。所以这一期专门总结了大家问的最多的&#xff0c;关于学习Python相关的问题来给大家聊。希望能带给大家不一样的参考。或者能提…

Linux 查看当前文件夹下的文件大小

1.直接查看: ll 或者 ls -la #查看文件大小&#xff0c;以kb为单位 ll#查看文件大小&#xff0c;包含隐藏的文件&#xff0c;以kb为单位 ls -la2.以 M 或者 G 为单位查看&#xff0c;根据文件实际大小进行合适的单位展示 du -sh *

vxe-table中树形结构

如图&#xff0c;同事让帮忙实现一个需求 从二级树节点开始&#xff0c;同时选中的只能有一个二级树节点&#xff0c;选中的二级树节点之下的子节点都可以被选中。否则不能被选中 直接上代码 需要注意的是&#xff0c;文中树状图传递的数据是打平的数据&#xff0c;设置代码是…

【Terraform学习】使用 Terraform创建Lambda函数启动EC2(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

20 - 分页

分页相关方法 # paginate(当前页, 每页显示几条):分页;返回一个对象 pagination 模型类.query.order_by(-模型类.对象).paginate(page2, per_page3) print(pagination.items) # [<Article 2>, <Article 3>] :每页的数据对象 print(pagination.page) # 当前的页…

【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}

map和set的介绍和使用 一、关联式容器 关联式容器和序列式容器是C STL中的两种不同类型的容器。 关联式容器是基于键值对的容器&#xff0c;其中每个元素都有一个唯一的键值&#xff0c;可以通过键值来访问元素。关联式容器包括set、multiset、map和multimap。 序列式容器是…

聚焦磷酸铁锂产线革新,宏工科技一站式解决方案

兼顾了低成本与安全性两大属性&#xff0c;磷酸铁锂市场在全球范围内持续升温&#xff0c;并有望保持较高的景气度。巨大的需求空间之下&#xff0c;行业对于锂电装备企业的自动化与智能化水平、整线交付能力、产品效率与稳定性等均提出了新的要求。 以宏工科技股份有限公司&a…

MySql014——分组的GROUP BY子句排序ORDER BYSELECT子句顺序

前提&#xff1a;使用《MySql006——检索数据&#xff1a;基础select语句&#xff08;使用products表、查询单列、多列、所有列、DISTINCT去除重复行、LIMIT限制返回结果的行数、了解完全限定&#xff09;》中创建的products表 一、GROUP BY子句基础用法 SELECT vend_id, COU…

【ArcGIS Pro二次开发】(63):批量更改字段别名

在我工作中遇到的大多数图斑&#xff0c;字段名称一般是英文&#xff0c;字段别名是中文&#xff0c;使用起来是比较方便的。 但有时候也会遇到一些不一样的情况&#xff0c;不知是经过了怎样的处理&#xff0c;图斑的字段别名被修改成了和字段名称一样的英文&#xff0c;这样…

仓储23代拣货标签操作指导

服务器使用 V1.4基站已经内置服务程序&#xff0c;无需搭建服务&#xff1b;可跳至第1.4部分 服务器搭建 安装mysql5.7, 创建db_wms数据库并导入原始数据库文件 安装jdk1.8, 配置java环境变量 下载tomca8.0, 部署wms.war到tomcat, 并启动tomcat 下载资源 Windows 64bit: …