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

文章目录

    • 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。

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

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

相关文章

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程,主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突,并能快速地完成项目,因此在很多软…

人工智能与机器学习行业新闻:颠覆企业运营方式的 AI 趋势

AI 推动业务转型 人工智能 (AI) 和机器学习已经在重塑各行各业的业务模式。AI 通过处理和整合数据支持战略决策的制定,其规模和速度远远超过了人脑。无疑,未来我们还将在 AI 领域取得许多重大突破,而拥有大量数据的行业可能会从人工智能革命…

Mac OS 下载安装与破解Typora

文章目录 下载Typora破解Typora1. 进入安装目录2. 找到并打开Lincense文件3. 修改激活状态4. 重新打开Typora 下载Typora 官网地址:typora官网 下载最新Mac版,正常安装即可 破解Typora 打开typora,可以看到由于未激活,提示使用期限还剩下15…

Three.js-01快速入门

1.导入three.js库 说明:资源在主页里面能够找到,如果不想使用本地的three.module.js文件,也可以使用在线的文件。 import * as THREE from "../three.module.js"// import * as THREE from https://unpkg.com/three/build/three.m…

学习 LangChain 的 LCEL

学习 LangChain 的 LCEL 0. 引言1. 基本示例:提示模型输出解析器​1-1. Prompt​1-2. Model1-3. Output parser1-4. Entire Pipeline 0. 引言 LCEL(LangChain Expression Language) 可以轻松地从基本组件构建复杂的链,并支持开箱即用的功能,…

mongoose httpserver浅析

文章目录 前言一、结构体及其功能二、函数MG_LOGmg_http_listenmg_mgr_poll question参考链接 前言 mongoose是一款基于C/C的网络库,可以实现TCP, UDP, HTTP, WebSocket, MQTT通讯。mongoose是的嵌入式网络程序更快、健壮,易于实现。 mongoose只有mong…

【网络编程】okhttp源码解析

文章目录 配置清单框架结构解析 配置清单 首先了解一下okHttp的配置清单&#xff1a; Dispatcher dispatcher &#xff1a;调度器&#xff0c;⽤于调度后台发起的⽹络请求&#xff0c;有后台总请求数和单主机总请求数的控制。List<Protocol> protocols &#xff1a;⽀持…

idea 打jar包、lib文件夹

idea目录文件 idea四层级结构 idea操作Java文件的基本单位&#xff1a;项目&#xff08;Project&#xff09;。对应四级结构 第1层级架构&#xff1a;项目&#xff08;project&#xff09; 在 IntelliJ IDEA 中Project是最顶级的结构单元&#xff0c;然后就是Module&#xf…

[HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:手机批发业务-商品备选区<

PyTorch概述(五)---LINEAR

torch.nn.Linear torch.nn.Linear(in_features,out_features,biasTrue,deviceNone,dtypeNone) 对输入的数据应用一个线性变换&#xff1a; 该模块支持TensorFLoat32类型的数据&#xff1b;在某些ROCm设备上&#xff0c;使用float16类型的数据输入时&#xff0c;该模块在反向传…

3.openEuler物理存储及逻辑卷管理(一):磁盘存储挂载与使用

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议下载麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 磁盘大类: HDD, (Hard Disk Drive的缩写) : 由一个或者多个铝制或者玻璃制成的磁性碟 片,磁头,…

消息中间件篇之RabbitMQ-高可用机制

一、怎么保证高可用性 在生产环境下&#xff0c;使用集群来保证高可用性&#xff0c;一般我们采用普通集群、镜像集群、仲裁队列。 二、普通集群 普通集群&#xff0c;或者叫标准集群&#xff08;classic cluster&#xff09;&#xff0c;具备下列特征&#xff1a; 1. 会在集…

LabVIEW串口通信的激光器模块智能控制

LabVIEW串口通信的激光器模块智能控制 介绍了通过于LabVIEW的VISA串口通信技术在激光器模块控制中的应用。通过研究VISA串口通信的方法和流程&#xff0c;实现了对激光器模块的有效控制&#xff0c;解决了数据发送格式的匹配问题&#xff0c;为激光器模块的智能控制提供了一种…

科学高效备考2024年AMC10:2000-2023年1250道AMC10真题练一练

我整理了2000-2023年的全部AMC10的AB卷真题共1250题&#xff0c;并且独家制作了多种在线练习&#xff0c;利用碎片化时间&#xff0c;一年足以通过自学在2024年AMC10竞赛中取得好成绩。 我们今天继续来随机看五道题目和解析。 2000-2023年AMC10真题练一练&#xff1a;2013年第…

一台台式电脑的耗电量有多少瓦?你知道吗?

核实后将予以处理。 感谢您为社区和谐做出的贡献。 一般来说&#xff0c;大多数台式电脑的功率在250W左右&#xff0c;也就是每4小时耗一度电。 一般有每小时100W左右的低功耗计算机&#xff0c;也有每小时1000W左右的高功耗计算机。 对于笔记本电脑来说&#xff0c;每小时约为…

990-03产品经理与程序员:什么是 IT 与业务协调以及为什么它很重要?

What is IT-business alignment and why is it important? 什么是IT-业务一致性&#xff1f;为什么它很重要&#xff1f; It’s more important than ever that IT and the business operate from the same playbook(剧本). So why do so many organizations struggle to ach…

3分钟彻底搞懂什么是 token

几年前在一次工作中&#xff0c;第一次接触到自然语言处理模型 BERT。 当时在评估这个模型的性能时&#xff0c;领导说这个模型的性能需要达到了 200 token 每秒&#xff0c;虽然知道这是一个性能指标&#xff0c;但是对 token 这个概念却不是很清晰。 因为当时接触视觉模型多…

快速启动-后台管理系统

目录 Gitee人人开源 后端快速启动 1.clone仓库到本地 2.初始化数据库 3.更改数据库连接 4.启动项目验证 前端快速启动 1.克隆仓库 2.vsCode打开 3.控制台npm install 4.验证测试 时代已然不同&#xff0c;后台管理也可以使用脚手架方式快速启动。 Gitee人人开源 地…

使用 ES|QL 优化可观察性:简化 Kubernetes 和 OTel 的 SRE 操作和问题解决

作者&#xff1a;Bahubali Shetti 作为一名运营工程师&#xff08;SRE、IT 运营、DevOps&#xff09;&#xff0c;管理技术和数据蔓延是一项持续的挑战。 简单地管理大量高维和高基数数据是令人难以承受的。 作为单一平台&#xff0c;Elastic 帮助 SRE 将无限的遥测数据&#…

谷歌连发 Gemini1.5、Gemma两种大模型,Groq让模型输出速度快18倍

本周&#xff0c;我们观察到以下AI领域的新动向和新趋势&#xff1a; 1.谷歌连发Gemini1.5和Gemma两种大模型&#xff0c; 其中Gemini1.5采用MoE架构&#xff0c;并拥有100万token上下文长度&#xff0c;相比Gemini 1.0性能大幅提升。Gemma是谷歌新推出的开源模型&#xff0c;…