一、Page Cache
1.page cache解释:在Linux读写文件时,用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。
2.产生page cache 的操作:read/write,mmap(内存映射)
1)read/write
①read:
当cpu首次从磁盘读取文件时,内存中是不存在page cache 的,因此先申请1(或n)页内存,然后通过io读取磁盘上的问题件加载到申请的内存当中,然后通过read返回读取到的数据。在此过程中会产生较多 major 行为的page fault,读取速度较慢。
当再次读取该文件时,由于该文件已经存储到page cache当中,所以直接从page cache中访问。读取速度相
对于第一次快很多。
②write
如果要写入的文件已经有了 page cahe,那么直接写入到 page cache 当中;如果没有,那么先申请 1(或n) 页page的内存,然后将磁盘中相应位置的数据读取到申请的页面当中,然后将要写入的数据写入申请页面当中对应的位置,其中写的过程会首先有一个读取的过程。(磁盘操作是按页处理的)
2)mmap
是将文件的一部分内容(其实就是pagecache的地址)map到进程的虚拟地址空间。
*p = mmap(…);
p就是返回的虚拟地址,通过对p操作来进行对文件的读写;
相对于 read/write 而言,mmap少了一层内存拷贝(从用户空间拷贝到内核空间)的操作
二、free命令详解
page cahce有两种形式的存在即cache 和 buffes。具体区别后面详细说明。
1、free指令:
从buddy角度来看,不关心用户(kernel、app、page cache)是谁。图中①表示实际物理内存的大小;②表示已经使用的物理内存大小(含page cache);③表示物理内存还有多少未使用;④和⑤表示的是page cache 占用已经使用的物理内存的大小。
从系统用户来看:page cache 是可以回收利用的,所以⑦(含page cache)是系统可以真正可以使用的内存大小;⑥是系统真正使用的内存,这部分内存是无法丢弃回收的。
所以会有如下公式
① = ② + ③
⑦ = ③ + ④ + ⑤
⑥ = ② - (④ + ⑤)
2、page cache 的两种形式:cache/buffers
cache:以文件系统中的文件为背景
buffers:以裸分区/dev/sdax等为背景
举例说明:
一个U盘,里面有三个文件1.txt、2.txt、3.txt;在/dev目录下的名称是sda1。
(1)如果我们在应用层直执行 dd if = /dev/sda1 就相当于从u盘的第一个字节开始一个一个的读取,这种裸磁盘读取上来的数据是存储到buffers当中的。
(2)如果我们执行 mount /dev/sda1 /mnt 指令,然后从 /mnt目录下 读取 1.txt,那么读取1.txt的文本内容的数据是存储到cache当中的;需要注意的是这种情况下1.txt的相关的配置信息比如说存储的位置、大小等这些数据仍然是存储到buffers当中的
3、新版本的内核当中free指令中已经没有了 buffers/cache 选项了,取而代之的是available选项
4、清空对应page cache
①echo 1 > /proc/sys/vm/drop_caches //清空 pagecache
②echo 2 > /proc/sys/vm/drop_caches //清空 dentries 和 inodes
③echo 3 > /proc/sys/vm/drop_caches //清空所有缓存(pagecache、dentries 和 inodes)
三、页面类型
1、File-backed:有文件背景的页面
①代码段
②mmap一个字体
代码段的本质就是page cache,是一种demangding page(消耗型页面),需要的时候从flash中加载到内存当中,不需要的时候也可以丢弃掉。
2、anonymous :匿名页
①statck
②Heap
③Cow (Copy On Write) pages
四、swap 和 zRam
1、swap 分区:可以将匿名页伪造成带文件背景的页面,存储到flash当中,从而使用物理的磁盘实现扩展内存。
2、在linux当中,swap从动词形式来看可以指带文件背景的页面与磁盘的数据交换,也可以指匿名页与swap分区的数据交换;从名词上来看,只表示匿名页与swap分区的数据交换。
3、绝大嵌入式系统由于各种条件限制是没有swap分区的
4、zRam:在新版的内核当中出现了以一块内存作为swap分区,将要swap的数据进行压缩存储到该内存区域当中,从而现实了以内存扩内存,这种形式的出现主要是通过牺牲CPU的算力实现的内存扩展。
5、关闭swap分区:swap off -a
五、页面回收和LRU
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。这里就不详细描述了,具体可以百度。LRU可能会触发pagecache或者anonymous页与对应文件的数据交换。