Linux内核File cache机制(上篇)

一、什么是File cache?

1.  File cache概述

Linux File cache机制,每次动笔想写到该知识点的时候,我心里总会犹豫迟疑,众所周知内存管理是Linux系统的比较难啃的子系统之一,而内核文件缓存机制是内存管理框架中难度较大的知识点。其中包括文件缓存预读取流程、写流程、回收流程等,希望我们这次将其一探究竟。

讨论Linux File cache前,先看下什么是Linux cache机制呢?

我们在使用Linux系统的时候,经常会发现系统的空闲内存(后文以memfree代替)经常处于一个较低的状态,有时8G的手机刚开机memfree就低于2G,而此时可能并无启动多少应用。仔细查看发现,此时系统的cached可能达到3G以上【图1:meminfo@1】,这时很多用户会有疑问:cached是什么?是内存泄露吗?显然不是。cached表示系统的缓存内存大小,当用户需要读取文件中的数据时,操作系统会先分配内存,然后将数据从存储器读入到内存中,最后将内存中的数据分发给用户;当用户需要往文件中写数据时,操作系统会先分配内存接收用户的数据,然后再将数据从内存写到磁盘中。而Linux cache机制就是对这些由操作系统内核分配,并用来存储文件数据的内存进行管理。

那么可能有人会问:Cache机制为什么会缓存这么大?是否会被回收?

如果系统内存充足,缓存在内存中的文件数据是可以在内存中长时间驻留的,如果有其他的进程访问这部分的数据,就不需要访问磁盘,我们知道内存访问速度比磁盘访问速度要快,该机制可以避免用户因为磁盘访问导致的长时间等待。所以在内存充足的情况下,系统的cache大小是会越来越大的;当系统的内存不足,Linux内存回收机制就会把cache的内存进行回收,以缓解内存压力。

在Linux内核中,cache主要主要包括:(对应【图1:meminfo@2】)

  • 普通文件数据的页面;

  • 目录等信息的页面;

  • 直接从块设备文件读出来的数据页;

  • swapcache;

  • 特殊文件系统的页面,例如shm文件系统;

cache中大部分是文件缓存,即本文讨论的File cache,其包含活跃和非活跃的部分,对应如下:Active(file)和Inactive(file)【图1:meminfo@3@4】。

【图1:meminfo】

2.  File cache机制框架

(1)系统层面下的File cache机制

【图2:Linux I/O操作流程图】

当用户发起一个读或者写文件请求时,流程如【图2】,整体的流程如下:

  • 系统调用read()会调用到VFS(Virtual file system,后文以VFS简称)相应的函数,传递参数有文件描述符合文件偏移量等;

  • 接着缓存机制(Buffer page Cache)确定请求的数据是否已经在内存缓冲区;如果在缓存区并且数据是最新的,那就不用发起IO操作,返回数据给用户。

  • 若数据不在内存中,确定如何执行读操作,通过具体的文件系统(Disk System)和通用块设备层(Generic Block layer),确定数据在物理设备中的位置,构建IO请求;

  • 在通用块设备之下是IO调度层(IO Scheduler Layer),根据内核的调度策略,对等待的IO等待队列进行排序;

  • 最后,块设备驱动(Block Device Driver)通过向磁盘控制器发送相应的命令,执行真正的数据传输;

VFS用于与系统调用read/write等接口进行交互,通过VFS后可以通过DIRECT_IO直接与具体的文件系统进行交互,如果没有DIRECT_IO,则会通过cache机制与具体的文件系统交互。具体的文件系统例如ext3/ext4等,通过Generic block layer和IO schedule layer与具体的块设备驱动交互。

所以理论上cached的机制的设计逻辑在于具体的具体文件系统之上,VFS之下,即上图中“Buffer page Cache”部分。

(2)File cache机制内部框架梳理

File cache机制,从内部框架简单分为两部分:File cache的产生和回收。学习文件缓存按照下面的框架进行由浅至深进行分析,更加容易抓住设计的逻辑。

  • File cache产生流程

  • 读文件:读文件流程以及预读机制,包括read和mmap发起的文件读取流程;

  • 写文件:写文件流程;

  • File cahce回收流程

以下的分析基于Linux-4.19,并且基于不讨论DIRECT_IO模式。

二、read发起读文件流程分析

1. read函数生命周期

用户读取的文件,可以有不同的实现方法,但是普遍是通过read系统和mmap接口进行读取,该章节介绍read的读取流程分析ÿ

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OPPO内核工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值