内核解读之内存管理(8)什么是page cache

news2024/10/6 10:28:04

文章目录

    • 0. 文件系统的层次结构
    • 1.什么是page cache
    • 2.感观认识page cache
    • 3. Page Cache的优缺点
      • 3.1 Page Cache 的优势
      • 3.2 Page Cache 的劣势

0. 文件系统的层次结构

在了解page cache之前,我们先看下文件系统的层次结构。
在这里插入图片描述
1 VFS 层

VFS ( Virtual File System 、Virtual FileSystem Switch )层是 Linux 针对文件概念封装的一层通用逻辑,它做的事情其实非常简单,就是把所有文件系统的共性的东西抽象出来,比如 file ,inode ,dentry 等结构体,针对这些结构体抽象出通用的 api 接口,然后具体的文件系统则只需要按照接口去实现这些接口即可,在 IO 下来的时候,VFS 层使用到文件所在的文件系统的对应接口。

它的作用:为上层抽象统一的操作界面,在 IO 路径上切换不同的文件系统。

假设现在你想要写个内核文件系统,那么只需要按照 Linux 预设的一些 api 接口,实现起来就行了。

2 文件系统

VFS 把 IO 给到具体的文件系统,文件系统主要做啥呢?

它的作用:对上抽象一个文件的概念,把数据按照策略存储到块设备上。

文件系统管理的是一个线性的空间(分区,块设备),而用户看到的却是文件的概念,这一层的转化就是文件系统来做的。它负责把用户的数据按照自己制定的规则存储到块设备上。比如是按照 4K 切块存,还是按照 1M 切块存储,这些都是文件系统自己说了算。

它这一层就是做了一层空间的映射转化,文件的虚拟空间到实际线性设备的映射。 这层映射最关键的是 address_space 相关的接口来做。

3 块层

块层其实在真实的硬件之上又抽象了一层,屏蔽不同的硬件驱动,块设备看起来就是一个线性空间而已。块层主要还是 IO 调度策略的实现,尽可能收集批量 IO 聚合下发,让 IO 尽可能的顺序,合并 IO 请求减少 IO 次数等等;

划重点:块层主要做的是 IO 调度策略的一些优化。比如最出名的电梯算法就是在这里。

因为所有的 IO 都会汇聚下来,那么在块层做调度优化是最合适的。Linux 也允许用户自行配置这里的调度策略,比如 CFQ,Deadline,NOOP 等策略。

4 SCSI 层

SCSI 层这个就不用多说了,这个就是硬件的驱动而已,本质就是个翻译器。SCSI 层里面按照细分又会细分多层出来。它是给你的磁盘做最后一道程序,SCSI 层负责和磁盘硬件做转换,IO 交给它就能顺利的到达磁盘硬件。

1.什么是page cache

文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。

由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存,即将文件中的数据缓存到page中,这些page就叫page cache。

页面缓存(Page Cache)是操作系统中的一种内存管理机制,用于缓存磁盘上的文件数据。它是在内核中维护的一部分内存,并将最近读取或写入的文件数据缓存在内存中,以提高文件访问的性能。

当应用程序需要读取文件时,内核会首先检查页面缓存中是否已经包含了所需的数据。如果数据已经在页面缓存中,则可以直接从内存中返回给应用程序,避免了频繁的磁盘访问。如果数据不在页面缓存中,则内核将从磁盘中读取数据到页面缓存,并返回给应用程序。

类似地,当应用程序写入文件时,数据会被写入页面缓存中,并由内核定期将缓存中的数据刷新回磁盘。

页面缓存的存在使得文件的读取和写入变得更加高效,因为内存的访问速度远远快于磁盘的访问速度。通过减少对磁盘的实际访问次数,页面缓存可以大大提升文件系统的性能,特别是在频繁读取相同文件或重复访问某些部分的情况下。

需要注意的是,页面缓存只是一种缓存机制,它并不提供数据持久性。文件数据仍然是存储在磁盘上的,而页面缓存只是磁盘数据的临时副本,可以被更新或替换。因此,在进行文件操作时,需要确保及时将数据刷新回磁盘,以确保数据的持久性和一致性。

在这里插入图片描述

额外扩展:
IO可分为缓存io和直接io,直接io跨过了page cache直接操作磁盘。

内核中的缓冲 I/O(Buffer I/O)和直接 I/O(Direct I/O)是用于实现磁盘数据读写的两种不同方式。

  1. 缓冲 I/O(Buffer I/O):
    • 缓冲 I/O 是指在进行磁盘读写时,数据会首先被缓存在操作系统内核的页缓存中。当进行读取操作时,数据会从磁盘读取到内核页缓存中,然后再从内核页缓存复制到应用程序的缓冲区中;而在进行写入操作时,数据会被先写入内核页缓存中,由操作系统负责定期将缓存中的数据刷新至磁盘。
    • 优点:利用了系统内存进行缓存,可以减少对磁盘的频繁读写,提高了访问速度。
    • 缺点:需要额外的内存开销来维护缓存,同时存在数据一致性的问题,因为数据首先写入到缓存中并非直接写入到磁盘,如果系统崩溃可能会导致数据丢失或不一致。
  2. 直接 I/O(Direct I/O):
    • 直接 I/O 是指数据在进行磁盘读写时,绕过系统内核的页缓存,直接在用户空间和磁盘之间进行数据传输。在进行读取操作时,数据直接从磁盘读取到应用程序的缓冲区中;在进行写入操作时,数据也直接从应用程序的缓冲区写入到磁盘中,而不经过内核页缓存。
    • 优点:避免了数据在内核缓存中的多次拷贝,减少了内存开销,并且可以提供更加可控的数据一致性。
    • 缺点:由于绕过了内核的缓存,直接 I/O 的效率受到了磁盘的物理特性限制,可能会降低读写性能。

在这里插入图片描述
上图中,红色部分为 Page Cache。可见 Page Cache 的本质是由 Linux 内核管理的内存区域。我们通过 mmap 以及 buffered I/O 将文件读取到内存空间实际上都是读取到 Page Cache 中。

2.感观认识page cache

通过读取 /proc/meminfo 文件,能够实时获取系统内存情况:

$ cat /proc/meminfo
...
Buffers:            1224 kB
Cached:           111472 kB
SwapCached:        36364 kB
Active:          6224232 kB
Inactive:         979432 kB
Active(anon):    6173036 kB
Inactive(anon):   927932 kB
Active(file):      51196 kB
Inactive(file):    51500 kB
...
Shmem:             10000 kB
...
SReclaimable:      43532 kB
...

根据上面的数据,你可以简单得出这样的公式(等式两边之和都是 112696 KB):

Buffers + Cached + SwapCached = Active(file) + Inactive(file) + Shmem + SwapCached

两边等式都是 Page Cache,即:

Page Cache = Buffers + Cached + SwapCached

在这里插入图片描述

公式推出来的

Cached + Buffers = Active(file) + Inactive(file) + Shmem;

可以看到page cache大体上分成了三大块:

  • cached
  • buffers
  • swap cache

Cache 用于缓存文件的页数据,buffer用于缓存块设备(如磁盘)的块数据。页是逻辑上的概念,因此 Cache 是与文件系统同级的;块是物理上的概念,因此 buffer是与块设备驱动程序同级的。直白讲,buffer面向底层的磁盘IO,cache面向文件系统IO。

cache除了包括缓存文件数据页,还包括了tmpfs和shmem,居然还包括共享内存确实费解,包括tmpfs可以理解。

另一方面,并不是所有 page 都被组织为 Page Cache。

Linux 系统上供用户可访问的内存分为两个类型,即:

  • File-backed pages:文件备份页也就是 Page Cache 中的 page,对应于磁盘上的若干数据块;对于这些页最大的问题是脏页回盘;
  • Anonymous pages:匿名页面是指没有对应磁盘上持久化数据的页面,通常用于存储进程的堆栈、堆等动态分配的内存空间。这些页面的内容通常是程序运行时动态产生的数据,不需要持久化到磁盘上。

上面提到两个词active和inactive,这是从另外一个维度来分类page:

Active和Inactive是内核中用于描述页面状态的两个术语,它们指示了页面被访问的活跃程度和可能被回收的优先级。

Active(活跃)页面是指最近被访问过的页面。这些页面包含了进程当前正在使用或最近使用过的数据。内核会根据页面的活跃程度来决定其在内存中的保留优先级。由于这些页面被频繁访问,内核通常会尽量将其保留在内存中,以提高访问速度和系统性能。只有在内存紧张时,才会考虑将活跃页面置换出去。

Inactive(不活跃)页面是指较长时间没有被访问过的页面。这些页面包含了过去被使用过,但是当前并没有被活跃访问的数据。虽然这些页面不再被频繁访问,但是由于内存空间充足,暂时不需要将其回收。当系统需要更多内存来分配给其他进程或用于其他目的时,内核可能会选择从不活跃页面中回收内存。

需要注意的是,活跃和不活跃页面仅表示页面的访问情况和内核对页面的管理优先级,并不意味着页面的内容是否有效或过期。这两者都是内核在内存管理中用于优化内存使用的概念,以提高系统的性能和资源利用效率。

3. Page Cache的优缺点

3.1 Page Cache 的优势

1.加快数据访问

如果数据能够在内存中进行缓存,那么下一次访问就不需要通过磁盘 I/O 了,直接命中内存缓存即可。

由于内存访问比磁盘访问快很多,因此加快数据访问是 Page Cache 的一大优势。

2.减少 I/O 次数,提高系统磁盘 I/O 吞吐量

得益于 Page Cache 的缓存以及预读能力,而程序又往往符合局部性原理,因此通过一次 I/O 将多个 page 装入 Page Cache 能够减少磁盘 I/O 次数, 进而提高系统磁盘 I/O 吞吐量。

3.2 Page Cache 的劣势

page cache 也有其劣势,最直接的缺点是需要占用额外物理内存空间,物理内存在比较紧俏的时候可能会导致频繁的 swap 操作,最终导致系统的磁盘 I/O 负载的上升。

Page Cache 的另一个缺陷是对于应用层并没有提供很好的管理 API,几乎是透明管理。应用层即使想优化 Page Cache 的使用策略也很难进行。因此一些应用选择在用户空间实现自己的 page 管理,例如 MySQL InnoDB 存储引擎以 16KB 的页进行管理。

Page Cache 最后一个缺陷是在某些应用场景下比 Direct I/O 多一次磁盘读 I/O 以及磁盘写 I/O。

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

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

相关文章

【Ubuntu】解决Ubuntu 22.04开机显示器颜色(高对比度/反色)异常的问题

使用Ubuntu 22.04时强制关机了一下(make -j16把电脑搞崩了),开机后系统显示的颜色异常,类似高对比度或反色,如下图。看着很难受,字体也没办法辨认。还好之前遇到过类似的问题,应该是一个配置文件…

装修避坑干货|阳台洗衣柜洗衣机一体柜设计。福州中宅装饰,福州装修

装修的时候常常会在洗衣柜中嵌入洗衣机,其实阳台柜的安装并不像看起来的那么简单,下面给大家说说几个注意事项‼️ 01.水电位置 在安装阳台柜之前,务必确认水电管道的位置。确保阳台柜不会阻碍水电管道的使用,以免造成不必要的麻…

Three.js-02Vue框架入手

1.创建项目 说明&#xff1a;默认有vue基础&#xff0c;node版本18以上。 vue create threejs 2.选择vue3 4.安装 npm i three 5. 修改页面 <template> <div></div> </template><script setup> import * as THREE from three;const width win…

查看仓库版本记录

打开命令行窗口 输入git log即可。 若发现分支不对&#xff0c;方法如下 查看项目目录&#xff0c;命令行输入dir可以查看 多个moudel&#xff0c;进入到需要查版本记录的moudel下 命令行输入cd .\文件名如wowo-win-server\ 切换到wowo-win-server文件夹下后&#xff0c;再输入…

【Unity】提示No valid Unity Editor liscense found.Please active your liscense.

有两个软件&#xff0c;如果只有一个&#xff0c;点黑的不会有效果、、、、&#xff08;楼主是这个原因&#xff0c;可以对号入座一下&#xff09; 简而言之&#xff0c;就是去下载Unity Hub&#xff0c;再里面激活管理通行证 问题情境&#xff1a; 点击unity出现以下弹窗&a…

板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】

板块一 Servlet编程&#xff1a;第八节 文件的上传下载操作 一、文件上传&#xff08;1&#xff09;前端内容&#xff08;2&#xff09;后端内容 二、文件下载&#xff08;1&#xff09;前端的超链接下载&#xff08;2&#xff09;后端下载 在之前的内容中我们终于结束了Servle…

C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义&#xff0c;即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢&#xff1f;所以同一个函数名的函数之间肯定是要存在不同点的&#xff0c;除了函数名外&#xff0c;还有返回类型和参数两部分可以…

【Linux】 faillock 命令使用

faillock 命令 faillock 命令是 PAM (Pluggable Authentication Modules) 的一部分&#xff0c;它被设计用来跟踪失败的登录尝试&#xff0c;并在连续失败尝试超过某个阈值时锁定账户。这个功能可以帮助系统管理员识别和防止暴力破解攻击。当一个用户连续多次输入错误的密码后&…

Vue.js+SpringBoot开发超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

Python中的functools模块详解

大家好&#xff0c;我是海鸽。 函数被定义为一段代码&#xff0c;它接受参数&#xff0c;充当输入&#xff0c;执行涉及这些输入的一些处理&#xff0c;并根据处理返回一个值&#xff08;输出&#xff09;。当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xf…

项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136276999 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

fpga_硬件加速引擎

一 什么是硬件加速引擎 硬件加速引擎&#xff0c;也称硬件加速器&#xff0c;是一种采用专用加速芯片/模块替代cpu完成复杂耗时的大算力操作&#xff0c;其过程不需要或者仅需要少量cpu参与。 二 典型的硬件加速引擎 典型的硬件加速引擎有GPU&#xff0c;DSP&#xff0c;ISP&a…

【Web】CTFSHOW 常用姿势刷题记录(全)

目录 web801 web802 web803 web804 web805 web806 web807 法一&#xff1a;反弹shell 法二&#xff1a;vps外带 web808 web809 web810 web811 web812 web813 web814 web815 web816 web817 web818 web819 web820 web821 web822 web823 web824 web825…

python统计分析——单因素方差分析

参考资料&#xff1a;用python动手学统计学 方差分析&#xff1a;analysis of variance&#xff0c;缩写为ANOVA 1、背景知识 1.1 要使用方差分析&#xff0c;数据的总体必须服从正态分布&#xff0c;而且各个水平内部的方差必须相等。 1.2 反复检验导致显著性结果更易出现…

专业130+总分410+上海交通大学819信号系统与信号处理考研上交电子信息通信生医电科,真题,大纲,参考书。

今年考研顺利结束&#xff0c;我也完成了目前人生最大的逆袭&#xff0c;跨了两个层级跨入c9&#xff0c;专业课819信号系统与信息处理135&#xff0c;数一130总分410&#xff0c;考上上海交大&#xff0c;回想这一年经历了很多&#xff0c;也成长了很多。从周围朋友&#xff0…

Mysql数据库学习之范式

范式 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则称为范式。可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的级别&#xff0c;要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 范式都包含哪些 6种范式…

在当前源文件的目录或生成系统路径中未找到文件

vsqt中增加&#xff0c;减少文件&#xff0c;都必须要动一下cmakelist.txt,点一下换行或者保存 因为vsqt反应不过来 1。都必须要动一下cmakelist.txt,点一下换行或者保存 2.然后全部重新生成&#xff0c;或者重新扫描解决方案&#xff08;多扫几次&#xff09;

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…

IDEA中Vue的安装和使用【window10】

一.准备工作 Vue是前端开发框架。搭建框架&#xff0c;首先要搭建环境。搭建Vue的环境工具&#xff1a;node.js&#xff08;JavaScript的运行环境&#xff09;&#xff0c;然后再用nodejs里面的npm&#xff08;包管理和分发工具&#xff09;来安装依赖包。二.安装node.js 下载…