[深入理解文件系统之九] Linux 中页高速缓存的实现

简介:

    深入理解Page Cache要求对Unix/Linux系统内存管理有深入的了解。以Linux为例,在x86系统上它提供了基于三级页表和TLB的虚拟内存管理方式。实现了虚拟地址到物理地址的转换,同时为上层的内核态和用户态调用提供了统一的接口。对于内核态的调用,内核自身除了代码段、静态数据之外的内存的申请和是否而言,它提供了基于页框管理的API; 对应用户态的应用,在申请和使用内存的时候,提供了基于缺页异常的内存描述符合线性区对象的管理。具体需要阅读《深入理解Linux内核》。而和文件系统相关的一部分是内核中的线性区数据结构vm_area_struct。


  • Page Cache中的内容

Linux 系统中 page cache可以支持多种不同类型的页,比如下面的几种:

a.页中包含普通文件的数据和基于磁盘文件系统的目录;

b.特殊设备和文件基于内存映射后的页;

c.页中的数据是直接从块设备读到的数据(跳过了文件系统层@@@)

d.页中还包含已经交换到磁盘上的数据

e. IPC共享的存储区,比如share memory


  • 页缓存数据结构

上述不同类型的页,对应了在调入和替换的时候不同的操作,为此需要为不同类型的页定义和实现不同的操作,为此引入了address_space作为桥梁,保证具体不同页的操作各自能实现期望的功能,同时向上提供统一的接口。涉及到的数据结构包括: inode/address_space:


struct inode {

    …..

    struct address_space * i_mapping;

    struct address_space  i_data;

    ….

}


struct address_space {

    struct list_head clean_pages;

    struct list_head dirty_pages;

    struct list_head locked_pages;

    unsigned long nrpages;


    …...

    struct address_space_operations * a_ops; // 属主页上的操作的方法

    strcut indoe * host; //point to host node

struct vm_area_struct * i_mmap; // 指向私有的内存映射区域

    struct vm_area_struct * i_mmap_shared;  // 指向公有的内存映射区域

    …….

    int gfp_mask; // 属主页的内存分配器标志

}


可以看到上面两个数据结构可以相互指向,同时在address_space送还有一个统一的struct a_ops, 看看它里面的具体内容可以看到,它包括下面的操作方法:

. writepage(): 从页写入属主的磁盘映像

. readpage(): 从属主的磁盘映像读到页

.sync_page():启动在页上已经安排的I/O数据传送操作

.prepare_write():准备针对基于磁盘文件的写操作

.commit_write():完成磁盘文件的写操作

.bmap():从文件块索引获得逻辑块号(很重要的一个函数,在IO路径上很关键)

.flushpage():准备删除来自属的磁盘映射的页

.releasepage():由日志文件系统来准备释放页

.direct_IO():数据页的直接传送 (SDDK/nvme上应该考虑用到过,以便充分释放硬件性能)


  • 页散列表

考虑到对大文件的处理过程,页高速缓存里装了许多和这个文件相关的页,此时为了查找指定偏移的文件内容,就需要扫描长长的页描述符链表,这可能变成了一个很耗时的操作,反而影响了page cache设计的初衷。为此,引入了页散列表(hash值)来加快查找。Linux内核中用page_hash_table【】的页描述符指针散列表,以address_space对象的地址和偏移量作为index来找到页表中指定文件偏移的内容。


可以看到,其实SVR4中的实现和Linux中的实现还是很像的,都有数据结构来实现程序中的段,然后基于段进行数据的缓存。




















本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1905121 ,如需转载请自行联系原作者

相关文章
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1562 10
|
8月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
416 16
|
11月前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
1131 78
|
10月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
565 15
|
11月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
2455 7
|
11月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
278 7
|
11月前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
300 8
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
207 7
|
存储 缓存 监控