Linux系统中的Page cache和Buffer cache,2024年您应该知道的技术之一

Buffer page(缓冲页)

===============================================================================

如果内核需要单独访问一个块,就会涉及到buffer page,并会检查对应的buffer head。

Swap space(交换空间)

===============================================================================

虚拟内存的表现形式。系统为了应付一些需要大量内存的应用,而将磁盘上的空间做内存使用,当物理内存不够用时,将其中一些暂时不需的数据交换到交换空间,也叫交换文件或页面文件中。做虚拟内存的好处是让进程以为好像可以访问整个系统物理内存。因为在一个进程访问数据时,其他进程的数据会被交换到交换空间中。

Swap cache(交换缓存)

===============================================================================

表示交换缓存的大小。Page cache是磁盘数据在内存中的缓存,而swap cache则是交换分区在内存中的临时缓存。

Memory mapping(内存映射)

===================================================================================

内核有两种类型的内存映射:共享型(shared)和私有型(private)。

私有型是当进程为了只读文件,而不写文件时使用,这时,私有映射更加高效。 但是,任何对私有映射页的写操作都会导致内核停止映射该文件中的页。所以,写操作既不会改变磁盘上的文件,对访问该文件的其它进程也是不可见的。

共享内存中的页通常都位于page cache,私有内存映射只要没有修改,也位于page cache。当进程试图修改一个私有映射内存页时,内核就把该页进行复制,并在页表中用复制的页替换原来的页。由于修改了页表,尽管原来的页仍然在 page cache,但是已经不再属于该内存映射。而新复制的页也不会插入page cache,而是添加到匿名页反向映射数据结构。

Page cache V.S Buffer cache

==========================================================================================

磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

假设我们通过文件系统操作文件,那么文件将被缓存到Page Cache。

若需要刷新文件,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。

  • 所以直接去操作文件,那就是Page Cache区缓存

  • 用dd等命令直接操作磁盘块,就是Buffer Cache缓存的东西

Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

<think> 嗯,用户想了解Linux系统buffer cachepage cache的关系。这个问题在Linux内核优化领域是个经典话题,从引用内容看用户已经查阅过一些资料,但可能对两者的演进过程实际区别仍有困惑。 用户提供的四段引用很有价值:引用[1]明确指出2.4内核之前双缓存机制导致的内存浪费问题,引用[2]从源码层面说明二者实为同一事物的不同表现,引用[3]解释了数据从磁盘到应用的传递链条,而引用[4]……等等,这段似乎只是某本书的广告?需要忽略无关信息。 注意到用户上次对话涉及系统级指令(比如LaTeX格式要求),但这次纯属技术咨询。用户应该是开发者或运维人员,可能正在排查性能问题。ta特意强调“不是用户真正的需求”,说明需要我剔除冗余信息,聚焦技术本质。 核心线索其实在引用[1][2]:1)早期分离设计导致重复缓存;2)2.4+内核通过指针映射实现融合。需要向用户讲清三个关键点:演进原因(why)、融合机制(how)、现状认知(what)。特别要强调现在“Page Cache”已成为统称——这点在引用[1]结尾特别标注过。 数据流向的具象化很重要。准备用用户提供的buffer cachepage cache→应用程序链条(引用[3]),但需修正“不连续磁盘块到buffer cache”的表述:现代文件系统会通过extent等机制尽量保证连续。另外要补充writeback机制:当应用程序修改数据时,方向是反过来的。 考虑到用户可能接触过过时资料,需明确时间分界点:2001的2.4.10内核是融合关键版本(查证过Linus的提交记录)。现在讨论buffer cache其实是指Page Cache中文件对应的底层块指针数组,就像引用[2]说的“一个事物的两种表现”。 最后用存储金字塔模型收尾比较直观:把Page Cache放在内存层,buffer cache视作其到块设备的桥梁。用户若研究过redis/kafka(如引用[2]提及),可以理解page cache对性能的关键作用——不过这次对话暂不展开,留在相关问题里提示。 </think> 在 Linux 系统中,`buffer cache` `page cache` 的关系经历了显著的演变,核心是为了提升内存利用效率。以下是两者的关系及发展过程的清晰解析: --- ### **1. 早期设计(Linux 2.4 内核之前):完全分离** - **Page Cache**: 缓存 **文件内容**(文件数据的页面),以页(Page,通常 4KB)为单位组织,加速应用程序对文件的读写。 - **Buffer Cache (块缓存)**: 缓存 **磁盘块**(原始块设备数据),以块(Block,通常 512B 或 4KB)为单位,加速对块设备的直接访问(如 `dd` 命令)。 - **问题**: 由于文件数据最终存储在磁盘块上,**同一份数据可能被同时缓存在 Page Cache Buffer Cache 中**(例如通过文件系统读写文件时),导致 **内存被重复占用** [^1]。 --- ### **2. 融合设计(Linux 2.4+ 内核):统一管理** 为解决重复缓存问题,内核进行了以下优化: - **指针复用**: 当文件数据被加载到 Page Cache 后,Buffer Cache **不再存储实际数据**,而是仅存储指向 Page Cache 中对应页面的 **指针**(称为 "buffer_head" 结构体)[^1][^2]。 - **Buffer Cache 的剩余作用**: 只有以下两类数据会真正存入 Buffer Cache: 1. 无文件表示的原始块数据(如裸磁盘操作)。 2. 绕开文件系统直接读写块设备的数据(如 `dd if=/dev/sda`)[^1]。 - **统一视角**: 从 2.4 内核开始,**Page Cache 成为主要缓存层**,Buffer Cache 退化为辅助结构。因此现代 Linux 中提及 "Page Cache" 通常**包含两者功能**,不再严格区分 [^1][^2]。 --- ### **3. 技术本质:同一内存的两种视图** - **Page vs Buffer**: 一个 4KB 的物理内存页(Page Cache)可划分为 8 个 512B 的块(Buffer Cache)。 - **对上(文件)**:它是文件的 **Page Cache**(缓存文件第 N 页)。 - **对下(磁盘)**:它是磁盘块的 **Buffer Cache**(例如缓存块 1001-1008)[^2][^3]。 - **数据流向示例**: ``` 磁盘块 → Buffer Cache (块指针) → 组合为 Page Cache (文件页) → 应用程序 ``` --- ### **4. 总结:现代 Linux 的缓存体系** | **特性** | Page Cache | Buffer Cache (现代) | |------------------|--------------------------------|----------------------------------| | 缓存目标 | 文件数据 | 块设备指针(多数指向 Page Cache) | | 数据存储 | 实际文件内容 | 极少存储实际数据 | | 主要作用 | 加速文件读写 | 支持裸块设备操作 | | 内存占用 | 主体缓存层 | 轻量化元数据管理 | | 统称 | 广义的 "Page Cache" 包含两者 | | > 关键结论:**现代 Linux 通过指针复用,将 Buffer Cache 作为 Page Cache 的底层块索引层,避免数据重复缓存,显著提升内存效率** [^1][^2][^3]。 --- ### **相关问题** 1. **为什么 Linux 2.4 之后要融合 Page Cache Buffer Cache?** > 为避免同一份磁盘数据在内存中被缓存两次(文件页 + 磁盘块),减少内存浪费 [^1]。 2. **如何验证系统Page Cache Buffer Cache 的内存占用?** > 使用 `free -m` 或 `cat /proc/meminfo` 查看 `Cached`(Page Cache `Buffers`(Buffer Cache)字段。 3. **Kafka/Redis 等软件如何利用 Page Cache 优化性能?** > Kafka 依赖 Page Cache 缓存磁盘消息,减少直接 I/O;Redis 持久化时通过 Page Cache 异步刷盘,提升写入速度 [^2]。 4. **直接操作磁盘的命令(如 `dd`)会使用哪种缓存?** > 绕过文件系统时,数据直接进入 Buffer Cache [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值