【操作系统】操作系统的Buffer和Cache

1.Buffer和Cache的区别

(1)什么是Buffer

  • Buffer指Linux内存的 Buffer cache(缓冲区)。
  • Buffer为了让不同的速度的设备能够同步,建立的一个缓冲区域,写进Buffer的数据是为了从中拿出写入其他设备。
buffers:  Memory used by kernel buffers (Buffers in /proc/meminfo)
内核缓冲区的内存,是/proc/meminfo 中的 Buffers 值

(2)什么是Cache

  • Cache指Linux内存中的 Page cache(缓存区)。
  • Cache是为了提高读取速度,将经常或马上需要的数据预读到缓存中,写进Cache的数据是为了其他设备从中去读取。
cache: Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
页缓存和 Slab 用到的内存,是 /proc/meminfo 中的 Cached 与 Slab之和

(3)二者的区别

  • 从软件这一层来说,Buffer是块设备的缓冲,Cache是文件系统的缓存。以Linux为例,Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。
  • Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。
  • Buffer 的主要目的是在不同应用、线程、进程之间共享字节数据,例如为了让不同速度的设备能够进行数据同步,就会使用共享 Buffer。
  • Cache 的主要目的是提高字节数据的读取/写入速度,例如根据时间局部性、地址局部性操作系统提供 page cache 机制。

2.磁盘和文件写入操作案例

  • Linux中的虚拟设备
#读它的时候,它会提供无限的空字符; 另一个常见用法是产生一个特定大小的空白文件
/dev/zero

#随机数设备,提供不间断的随机字节流, 当系统中断过多时,/dev/random设备会 挂起 ,产生数据速度较慢,但随机性好
/dev/random

#随机数设备,提供不间断的随机字节流, 不依赖系统中断,数据产生速度快,但随机性较低
/dev/urandom

#看作"黑洞",它等价于一个只写文件,所有写入它的内容都会永远丢失
/dev/null
  • 写入之前先清理一下Buffer/Cache
#用命令来释放缓存,  建议先执行sync命令, 将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、延迟的块 I/O 等

#1:释放页缓存
echo 1 > /proc/sys/vm/drop_caches

#2:释放dentries和inodes,即清除回收slab分配器中的对象
echo 2 > /proc/sys/vm/drop_caches

# 3:释放所有缓存
echo 3 > /proc/sys/vm/drop_caches

(1)写入文件案例

  • 一个终端执行 vmstat 监视负载信息
vmstat 2 
  • 一个终端监控内存信息
free -h -w -s 5
  • 在另外一个终端执行dd,把安全的随机设备 /dev/urandom,写入/tmp/test.txt文件,写入的数据大小500M
dd if=/dev/urandom of=/tmp/test.txt bs=1M count=500

在这里插入图片描述
在这里插入图片描述

  • 发现写入文件的时候,Cache中会增加。

(2)写入磁盘案例

  • 写入磁盘前也是先清理下缓存。
# 首先清理缓存
echo 3 > /proc/sys/vm/drop_caches
  • 然后运行dd命令向磁盘分区/dev/sdb1写入2G数据
dd if=/dev/urandom of=/dev/sda bs=1M count=2048

在这里插入图片描述
在这里插入图片描述

可以看到,虽然同是写数据,写磁盘和写文件的想象很不一样,写磁盘时即bo 大于 0时,Buffer和 Cache都在增长,但显然 Buffer的增长快得多。写磁盘用到了大量的 Buffer.我们发现,写文件时会用到Cache缓存数据,而写磁盘则会用到Buffer 来缓存数据。所以,Cache即缓存读文件也缓存写文件。

3.磁盘和文件读取操作案例

  • 首先清理一下缓存
echo 3 > /proc/sys/vm/drop_caches

在这里插入图片描述

(1)文件读取案例

dd if=/tmp/test.txt of=/dev/null

在这里插入图片描述
在这里插入图片描述

  • 读取文件时,发现bi增长,Buffer保持不变,而Cache再不断增长。

(1)磁盘读取案例

dd if=/dev/sda of=/dev/null

在这里插入图片描述
在这里插入图片描述

  • 读取磁盘时,发现bi增长,Buffer不断增长,而Cache保持不变,证明我们之前说的结论是对的,读写文件时操作的是cache,读写磁盘时操作的是buffer。

由此我们得知:

  • Buffer 是对磁盘数据的缓存,它即可以作为将要写入的磁盘数据的缓存,也可以作为从磁盘读取数据的缓存。
  • Cache 是对文件数据的缓存,它即可以作为从文件读取数据的页缓存,也可以用作写文件的页缓存。

我们都知道,文件是通过文件系统负责和磁盘交互,磁盘是块设备文件,直接读写磁盘或者分区,就会跳过文件系统,产生裸I/O,因此 文件和磁盘的缓存 的管理非常不同。

4.Cache和Buffer的命中案例

  • 首先先清理一下缓存
echo 3 > /proc/sys/vm/drop_caches

(1)文件写入读取案例

# 先向文件中写入500M
dd if=/dev/urandom of=/tmp/test.txt bs=1M count=500
# 然后再将其读取出来
dd if=/tmp/test.txt of=/dev/null

在这里插入图片描述
在这里插入图片描述

(2)磁盘写入读取案例

# 先读取1G的数据到buffer
dd if=/dev/sda1 of=/dev/null bs=1M count=1024
# 然后在读取一遍,看看有没有命中缓存
dd if=/dev/sda1 of=/dev/null bs=1M count=1024

在这里插入图片描述

在这里插入图片描述

至此,整篇对Buffer和Cache的作用以及演示就到这里了,由上面的案例我们也最终确认了开头的结论:

  • cache用于文件读写的缓存。
  • buffer用于磁盘读写的缓存,也就是裸I/O。

猜你喜欢

转载自blog.csdn.net/weixin_47533244/article/details/128603465