0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Buffer和Cache的定义

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-05-13 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

BufferCache 的定义:

  • Buffer:是原始磁盘块的临时存储,即将缓存数据写入磁盘。它通常不会很大(大约 20MB)。这样,内核就可以将分散的写入集中起来,从而对磁盘写入进行统一优化。例如,多个小的写入可以合并为一个大的写入等。

  • Cache:是用于从磁盘读取文件的页面缓存,用于缓存从文件中读取的数据。这样,下次访问这些文件数据时,可以直接从内存中快速取回,而无需再次访问缓慢的磁盘。

但是让我问你,由于 Buffer 只是将写入磁盘的数据的缓存。反过来,它还会缓存从磁盘读取的数据吗?或者 Cache 是从文件中读取数据的缓存,那么它是否也为写入文件缓存数据呢?

如果你能回答以上两个问题,你可以跳过这篇文章,我想你已经对 BufferCache 有了很好的理解。但如果你不能,请留下来看看我的进一步解释。

free 命令

要检查系统内存使用情况,您想到的第一个命令可能是 free ,例如:

$free-h
totalusedfreesharedbuff/cacheavailable
Mem:1.9G1.0G394M2.6M491M728M
Swap:0B0B0B

很明显,该输出包括了物理内存 MemSwap 的具体使用情况(如总内存、已用内存、缓存、可用内存等)。缓存是 BufferCache 两部分的总和。

让我们看一下 free 的手册页中的 BufferCache 定义:

buffers
Memoryusedbykernelbuffers(Buffersin/proc/meminfo)
cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimablein/proc/meminfo)
buff/cache
Sumofbuffersandcache

我们可以看到 free 命令的源数据实际上存储在 proc/meminfo 文件中。正如我前面提到的,/procLinux 内核提供的一个特殊的文件系统,它就像一个用户与内核交互的接口

/proc 文件系统也是许多性能工具的最终数据源。在 man proc 中,BuffersCached 的定义如下:

Buffers%lu
Relativelytemporarystorageforrawdiskblocksthatshouldn'tgettremendouslylarge(20MBorso).
Cached%lu
In-memorycacheforfilesreadfromthedisk(thepagecache).Doesn'tincludeSwapCached.
...
SReclaimable%lu(sinceLinux2.6.19)
PartofSlab,thatmightbereclaimed,suchascaches.

SUnreclaim%lu(sinceLinux2.6.19)
PartofSlab,thatcannotbereclaimedonmemorypressure.

至此,您可能认为您已经找到了我的问题的答案,“Buffer”只是用于将数据写入磁盘的缓存,“Cache”只是用于从文件中读取数据的缓存。但事实上,“Buffer”也可以用于读取,“Cache”也可以用于写入。

实验

我们将在这里做两个实验,写缓存和读缓存。

写入 Cache

让我们登录到我们的 Linux 主机并准备好两个终端。在终端 1,让我们先清理缓存

c2f2f4ae-d25e-11ec-bce3-dac502259ad0.png

这里 /proc/sys/vm/drop_caches 是一个通过 proc 文件系统修改内核行为的例子。写入 3 意味着清理各种缓存,例如文件页、目录条目和 Inode。

仍然在终端 1,让我们开启 vmstat 2 命令:

c3058236-d25e-11ec-bce3-dac502259ad0.png
  • buffcache 就是我们前面看到的 BufferCache,单位是 KB。
  • bibo 分别表示块设备读取和写入的大小,以块/s 为单位。由于 Linux 中的块大小为 1KB,因此这个单位相当于 KB/s。

接下来,转移到终端 2 并运行以下命令:

c31a58e6-d25e-11ec-bce3-dac502259ad0.png

现在切换回终端 1,并观察 buffcache 的变化:

c32ecd6c-d25e-11ec-bce3-dac502259ad0.png

通过观察 vmstat 的输出,我们发现运行 dd 命令时,Cache 一直在增长,而 Buffer 基本没有变化。

读取 Buffer

现在,让我们做第二个实验。再次清除终端 1中的缓存

c34774d4-d25e-11ec-bce3-dac502259ad0.png

同样在终端 1 中,再次启动 vmstat 2 命令:

c36567fa-d25e-11ec-bce3-dac502259ad0.png

您可以看到此时 buff0。现在在终端 2 中,运行以下命令:

c37f4dc8-d25e-11ec-bce3-dac502259ad0.png

然后,回到终端 1 观察:

c3991460-d25e-11ec-bce3-dac502259ad0.png

观察 vmstat 的输出,你会发现在读盘的时候(也就是 bi > 0 的时候),BufferCache 都在增长,但是显然 Buffer 的增长要快很多。这意味着当从磁盘读取时,数据被缓存在 Buffer 中。

现在我们几乎可以得出结论:

读取文件时数据会缓存在 Cache 中,读取磁盘时数据会缓存在 Buffer 中。

结论

在这里您应该会发现,虽然本文对 BufferCache 进行了描述,但仍然无法涵盖所有细节。我们如今学到了以下两点:

  • Buffer:既可以用作“要写入磁盘的数据缓存”,也可以用作“读取磁盘读的数据缓存”。
  • Cache:既可以用作“从读取文件的页面缓存”,也可以用作“写入文件的页面缓存”。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    394

    浏览量

    26301
  • buffer
    +关注

    关注

    2

    文章

    120

    浏览量

    31012
  • 命令
    +关注

    关注

    5

    文章

    746

    浏览量

    23452

原文标题:Linux 内存中的缓冲区(Buffer)与缓存(Cache)

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    采用Prefetch+Cache架构有什么优势?

    我看官方说,采用Prefetch+Cache架构同频CoreMark 计算力/功耗比超越同类产品,这优势就是低功耗么?要是具体芯片比较的话,应该怎么比?
    发表于 12-11 07:35

    单片机内部FLASH字节操作

    buff [*][i]{ [*][i]cache.u32data=FLSAH_ReadWord(pageaddr+i); [*][i]buffer[i]=cache.buf[0]; [*][i][i
    发表于 11-24 06:40

    USB读RAM buffer使用规范建议

    Questions:硬件和软件同时去访问 USB RAM buffer 造成数据乱掉或丢失 造成乱码流程: 软件设置 USB Valid 关总中断,USB 收数据到 RAM Buffer,此时
    发表于 09-22 17:27

    gd32h737 开启cache程序跑飞是哪里的问题?

    gd32h737 在rtthread 4.1.1版本上运行,开启cache功能,程序跑飞,JLink连接失败的。错误信息没有。配置方式的说明吗? /*! briefenable the CPU
    发表于 09-11 08:28

    什么情况会导致BUFFER_RYD一直为低电平?

    ,在c++ streamer中检测是否成接收到USB_BULK数据,结果显示4014可以接收到USB_BULK数据,4024不能接收到USB_BULK数据。结果如下图: 2、BUFFER_RDY信号
    发表于 08-14 06:21

    STM32H7的MPU配置与D-Cache冲突如何解决?​​

    现象​​: STM32H743 MPU 与 D-Cache 冲突问题详细描述** 硬件环境 MCU 型号 :STM32H743VIT6 开发板 :自定义板(或 STM32H743I-EVAL 等
    发表于 06-23 17:32

    如何在NXP MCU上启用D-Cache

    Data Cache,我已经能够减少其他 MCU 的推理时间。我想知道如何在 NXP MCU 上启用 D-Cache。任何其他性能提升策略也受到欢迎。
    发表于 03-27 07:48

    请问惊鸿7110是否支持cache维护指令?

    惊鸿7110是就sifive u74处理器的。查看了一下u74手册,它是有专门的cache维护指令CFLUSH.D.L1。在赛昉官方版本编译不通过。请问一下大佬,这个怎么解决呀?
    发表于 03-10 07:24

    DLP4500EVM是否支持自动循环从FLASH加载图片到BUFFER中?

    中,没有DLPLCR4500GUI-***-********.zip文件,能不能给出一个下载地址? 2. 一直没有找到这个文件DLPR350PROM_v2.0.0.bin,能不能提供一下? 3. DLP4500EVM是否支持自动循环从FLASH加载图片到BUFFER中? 盼回复!
    发表于 02-27 06:50

    马达的基本定义

    马达,即电动机、发动机的俗称,以下是几个关于马达的定义 ‌: ‌ 基本定义 ‌: 马达是英语motor的音译,是一种能够将电能、流体动能、压缩空气的内能转化为机械能的装置‌12。 ‌ 电磁装置定义
    的头像 发表于 02-24 11:16 8685次阅读

    Linux服务器卡顿救星之一招释放Cache内存

    为了加速操作和减少磁盘I/O,内核通常会尽可能多地缓存内存,这部分内存就是Cache Memory(缓存内存)。根据设计,包含缓存数据的页面可以按需重新用于其他用途(例如,应用程序)。 缓存内存
    的头像 发表于 01-16 10:04 2173次阅读

    DAC5672 buffer处不应该是output类型吗?

    buffer处不应该是output类型吗?还是说仅仅IBIS无法仿真?
    发表于 01-15 07:21

    const定义的是不是常量

    C语言是如何定义常量的?const定义的算不算是常量? 常见的有这么几种方式。 首先就是宏定义,使用 define 来定义。 宏的特点就是在预处理的时候被替换,比如这个地方的 SIZE
    的头像 发表于 01-14 11:35 667次阅读

    ADS1256EVM开发板使能buffer后采集不正常是怎么回事?

    1.5V电池,正接AIN1,负接AIN0 不使能buffer时,采集电池电压正常: 使能buffer后,采集电池电压变成这样: 基本上就是50Hz的工频干扰。 如果将AIN0和AGND短路,使能buffer是这样:
    发表于 12-26 07:03

    什么是缓存(Cache)及其作用

    缓存(Cache)是一种高速存储器,用于临时存储数据,以便快速访问。在计算机系统中,缓存的作用是减少处理器访问主存储器(如随机存取存储器RAM)所需的时间。 缓存(Cache)概述 缓存是一种位于
    的头像 发表于 12-18 09:28 1.5w次阅读