首页 > 其他分享 >【操作系统】操作系统的Buffer和Cache

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

时间:2023-01-18 17:31:07浏览次数:52  
标签:缓存 操作系统 Buffer Cache 写入 dev 磁盘


文章目录

  • ​​1.Buffer和Cache的区别​​
  • ​​2.磁盘和文件写入操作案例​​
  • ​​3.磁盘和文件读取操作案例​​
  • ​​4.Cache和Buffer的命中案例​​

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

【操作系统】操作系统的Buffer和Cache_服务器


【操作系统】操作系统的Buffer和Cache_数据_02

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

(2)写入磁盘案例

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

【操作系统】操作系统的Buffer和Cache_服务器_03


【操作系统】操作系统的Buffer和Cache_服务器_04

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

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

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

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

(1)文件读取案例

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

【操作系统】操作系统的Buffer和Cache_缓存_06


【操作系统】操作系统的Buffer和Cache_服务器_07

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

(1)磁盘读取案例

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

【操作系统】操作系统的Buffer和Cache_服务器_08


【操作系统】操作系统的Buffer和Cache_后端_09

  • 读取磁盘时,发现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

【操作系统】操作系统的Buffer和Cache_服务器_10


【操作系统】操作系统的Buffer和Cache_数据_11

(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_linux_12

【操作系统】操作系统的Buffer和Cache_后端_13

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

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


标签:缓存,操作系统,Buffer,Cache,写入,dev,磁盘
From: https://blog.51cto.com/u_15646271/6019339

相关文章

  • 阅文加入 OpenCloudOS 操作系统社区,作为成员单位参与社区共建
    近日,阅文集团宣布加入OpenCloudOS操作系统开源社区。阅文集团成立于2015年3月,是一家以数字阅读为基础,IP培育与开发为核心的综合性文化产业集团,旗下囊括QQ阅读、起......
  • 操作系统——进程同步互斥分析
    如何实现进程同步假设有两个代码块S1,S2顺序进行(先S1后S2),在在S1和S2之间设个信号量S,则先V后P分析:信号量初始设置为0,先V让它变为1才能在P那里不阻塞进行,如果先P让信号量......
  • Nginx proxy buffer配置
    1.问题情况最近发现nginx日志出现大量的这种错误:anupstreamresponseisbufferedtoatemporaryfile12345672023/01/1715:14:14[warn]18239#......
  • 回收linux中的cache
    Linux内存中的Cache真的能被回收么?入门小站 入门小站 2023-01-0922:15 发表于湖北收录于合集#Linux677个#内存3个入门小站分享运维技巧及10k+S......
  • JS二进制:File、Blob、FileReader、ArrayBuffer、Base64
    JavaScript提供了一些API来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64等。  Blob全称为binarylargeobject,即二进制大对象,它是......
  • 操作系统面试题(史上最全、持续更新)
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案
    最近一直使用良好的keychronk3键盘,忽然出现了一些问题。我用的是Windows11操作系统。keychronk3采用蓝牙模式连接。能够成功配对,但Connected状态只能持续1秒钟,随......
  • 操作系统有意思
    概述操作系统是什么?(不同的视角)进程管理进程,线程,协程进程/线程:操作系统提供的一种并发处理任务的能力。协程:程序员通过高超的代码能力,在代码执行流程中人为的实现多任......
  • Spring Cache 快速入门
    一、SpringCache快速入门1、SpringCache简介什么是SpringCache?SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spr......
  • gcache使用
    gcachegache感觉是个很不错的库,小巧实用,funcmain(){//size:10gc:=gcache.New(10).Build()gc.Set("key","value")v,err:=gc.Get("key")iferr!......