我是靠谱客的博主 友好胡萝卜,最近开发中收集的这篇文章主要介绍文件系统cache机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

复杂度3/5
机密度3/5

最后更新2021/04/27

AIX并未采用传统Unix的cache模式。传统Unix(包括Linux)的cache模式是把cache作为一个单独的旁路应用,嵌入在文件读写的路径中。当应用请求读文件时,kernel从磁盘将数据读到kernel的cache空间,然后把数据转给应用;应用请求文件写的时候,应用把数据发给kernel,kernel根据配置参数,或者只把数据保存在cache空间就返回(回写write back模式),或者保存到cache空间之后再继续写磁盘,完成后才返回(透写write through模式),或者并不写cache,完全直接写盘(旁写write bypass模式)。无论哪一种模式,都无法高效利用内存,或者额外一次数据在内存中的移动。这是因为内核cache不能直接被应用访问,必须完成cache到应用buffer之间的数据转移之后才能修改数据,这种数据转移必然需要一次用户地址空间到内核地址空间的数据move。

AIX采用的策略是在虚拟内存空间中设置了额外一种内存段给应用直接使用,用于与磁盘文件之间进行直接映射。此内存不属于内核数据,因此可以被应用直接操作,应用修改此内存数据,既等于修改了磁盘数据。此虚拟内存由AIX的VMM统一管理,如果内存被更新,定期执行的syncd进程将会以一定周期(一般是60秒,可修改)将数据刷新到磁盘(相当于回写模式)。由于AIX 虚拟内存极其巨大,因此几乎可以映射实际存在的任意大小文件(32位AIX下最大可编辑文件只有2GB,是个例外,但有其它机制实现类似功能,由于已经过时,我们此处就不刨坟了)。

具体来说,应用使用read()读磁盘数据的时候,kernel将要读取的数据转换为对应的4K虚拟内存页面,并按照与其它内存管理过程相同的过程进行管理:既真正访问某个页面则根据是否有物理内存映射进行物理内存分配,根据是否映射磁盘文件/交换区数据去触发将数据paging in过程。

写操作有主动和被动两种触发。主动方式是通过fsync()或fclose()触发将当前虚拟内存空间中所有被修改的页面回写到磁盘;被动方式是由syncd定时回写。

根据AIX这个文件系统cache的机理,有以下几点需要注意:

  1. aix的文件写入都是回写方案,除非应用采用特别的机制去绕过aix cache机制。例如打开文件时可以选择dio参数,则会跳过vmm映射,由应用去直接管理磁盘文件的数据。
  2. 此处所说的aix文件系统是JFS/JFS2/NFS以及其它IBM提供的文件系统,如果是第三方的文件系统,则具体实现是由该文件系统自身决定,VMM,磁盘映射等等技术是文件系驱动程序完成的。只能说AIX随安装盘提供的文件系统驱动,都是用这种方式管理,其它文件系统情况看驱动提供者自身设定。
  3. AIX这种技术对大部分情况都比较有效,但对于大文件,顺序文件(备份文件),以及数据库文件等特别文件,可能会存在重复cache,无效cache等情况。在这些场景要调整一些参数以提升效率。

相关的一些信息可参考AIO,DIO,CIO。

最后

以上就是友好胡萝卜为你收集整理的文件系统cache机制的全部内容,希望文章能够帮你解决文件系统cache机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部