(本文参考了目前网上的一些博客,加上作者自己的理解)
核心网址:https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/
Linux操作系统把设备分为三种
1)块设备,比如磁盘,光盘
2)字符设备,只能顺序访问,比如键盘
3)网络设备,只能顺序访问,比如网卡,蓝牙设备
块设备和字符设备,在文件系统的目录树可以找到,一般都在dev下,网络设备不在目录树上。
块设备支持随机访问,实现对数据的缓存,脏数据的会写等,因此对块设备的优化十分重要。
针对块设备的IO在Linux版本叫缓存区高速缓存(buffer)。
内核为设备提供了俩种缓存方案
1)页缓存(page cache)
2)块缓存
页缓存针对2.4内核后引入了虚拟内存管理机制来说明的。通过free命令来进行查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@tools ~]# free
total used free shared buff/cache available
Mem: 3798596 2556336 252436 8712 989824 1038528
Swap: 4128764 291072 3837692
[root@tools ~]# free -m
total used free shared buff/cache available
Mem: 3709 2496 246 8 966 1014
Swap: 4031 284 3747
[root@tools ~]# free -h
total used free shared buff/cache available
Mem: 3.6Gi 2.4Gi 245Mi 8.0Mi 966Mi 1.0Gi
Swap: 3.9Gi 284Mi 3.7Gi
Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。
buff/cache实现了块和页缓存的合并,在内存不足的时候,是可以被交换出去的。
linux中页缓存的本质就是对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同进程之间的数据共享。因此,linux中页缓存的引入主要是为了解决两类重要的问题:
1
2
3
1.磁盘读写速度较慢(ms 级别);(内存是磁盘的万倍以上)
2.实现不同进程之间或者同一进程的前后不同部分之间对于数据的共享; 如果没有进程之间的共享机制,那么对于系统中所启动的所有进程在打开文件的时候都要将需要的数据从磁盘加载进物理内存空间,这样不仅造成了加载速度变慢(每次都从磁盘中读取数据),而且造成了物理内存的浪费。为了解决以上问题,linux操作系统使用了缓存机制。在虚拟内存机制出现以前,操作系统使用块缓存机制,但是在虚拟内存出现以后操作系统管理IO的粒度更大,因此采用了页缓存机制。此后,和后备存储的数据交互普遍以页为单位。页缓存是基于页的、面向文件的一种缓存机制。
页缓存
1.内存和IO是以页为最小单位进行的,Linux系统中1页的大小为4K。
查看命令
1
2
3
4
[root@tools ~]# /usr/bin/time -v date
...
Page size (bytes): 4096
...