Linux 中缓冲区和缓存内存的区别是什么?

对我来说,不清楚两个 Linux 内存概念: buffercache之间的区别。我已经通读了 这篇文章,在我看来,它们之间的区别在于过期政策:

  1. 缓冲区的政策是先进先出
  2. 缓存的策略是最近最少使用。

我说的对吗?

特别是,我要查看两个命令: freevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859
248777 次浏览

“缓冲区”表示有多少 RAM 专用于缓存磁盘块。“ Cached”类似于“ Buffers”,只不过这次它从文件读取中缓存页面。

引自:

Buffer 是一个内存区域,用于在数据从一个地方移动到另一个地方时临时存储数据。

Cache 是一个临时存储区域,用于存储频繁访问的数据以便快速访问。一旦数据存储在缓存中,将来可以通过访问缓存的副本而不是重新获取原始数据来使用,这样平均访问时间会更短。

注意: 缓冲区和缓存也可以在磁盘上分配

缓冲区和缓存。

缓冲区是尚未“写入”到磁盘的东西。

缓存是从磁盘“读取”并存储以供以后使用的内容。

缓冲区与特定的块设备和覆盖缓存相关联 文件系统元数据,以及跟踪飞行中的页 只包含停放的文件数据。也就是说,缓冲区记住 在目录中,什么是文件权限,并跟踪什么 存储器被写入或读入到一个特定的块设备。 缓存只包含文件本身的内容。

引用链接

引述答案(供参考) :

简短的回答: Cached 是页面缓存的大小。缓冲区是内存块 I/O 缓冲区的大小。缓存很重要; 缓冲区在很大程度上是不相关的。

答案很简单: Cached 是 Linux 页面缓存的大小,减去交换缓存中的内存,交换缓存由 SwapCached 表示(因此总的页面缓存大小是 Cached + SwapCached)。Linux 通过页面缓存执行所有文件 I/O。写操作的实现只是简单地将页缓存中对应的页标记为脏页; 刷新线程然后定期将任何脏页写回磁盘。读取是通过从页缓存返回数据来实现的; 如果数据尚未在缓存中,则首先填充该数据。在现代的 Linux 系统上,Cached 很容易达到几 GB。它只有在内存压力作用下才会收缩。系统将清除页面缓存,同时将数据交换到磁盘,以便根据需要提供更多的内存。

缓冲区是内存块 I/O 缓冲区。它们的寿命相对较短。在 Linux 内核版本2.4之前,Linux 有单独的页面和缓冲区缓存。自2.4以来,页面和缓冲区缓存是统一的,缓冲区是未在页面缓存中表示的原始磁盘块,即不是文件数据。因此,Buffers 度量的重要性是最小的。在大多数系统上,Buffers 通常只有几十兆字节。

事情不是这么简单,但它可能有助于理解:

缓冲区是用来存储文件元数据(权限、位置等)。

缓存用于存储实际的文件内容。

我认为这个页面将有助于深入理解缓冲区和缓存之间的区别

与访问(实际)内存相比,从磁盘读取数据非常慢。此外,通常在相对较短的时间内多次读取磁盘的同一部分。例如,可以首先读取电子邮件,然后在回复时将信件读入编辑器,然后在将其复制到文件夹时让邮件程序再次读取。或者,考虑一下命令 ls在有多个用户的系统上运行的频率。通过只从磁盘读取一次信息,然后将其保存在内存中,直到不再需要为止,可以加快除第一次读取之外的所有操作。这称为磁盘缓冲,用于此目的的内存称为缓冲区缓存。

不幸的是,由于内存是一种有限的、甚至是稀缺的资源,因此缓冲区缓存通常不够大(它无法保存人们想要使用的所有数据)。当缓存填满时,已经使用了最长时间的数据被丢弃,因此释放的内存被用于新数据。

磁盘缓冲也适用于写操作。一方面,写入的数据通常很快就会被再次读取(例如,一个源代码文件被保存到一个文件中,然后由编译器读取) ,因此将写入缓存中的数据放入缓存是一个好主意。另一方面,只将数据放入缓存,而不是立即将其写入磁盘,则写入的程序运行得更快。然后可以在后台执行写操作,而不会减慢其他程序的速度。

Buffer 包含有助于提高写性能的元数据

缓存包含文件内容本身(有时尚未写入磁盘) ,这提高了读性能

Seth Robertson 的 Link 2说: “要彻底理解这些术语,请参考 Robert M. Love 的 Linux 内核开发书籍。”

我在这本书的第二版中找到了一些关于“缓冲”的内容。

尽管物理设备本身在扇区级别上是可寻址的,但是内核执行所有的磁盘操作(以块为单位)。

当一个块被存储在内存中(比如,在读取或写入之后) ,它被存储在一个“缓冲区”中。每个“缓冲区”恰好与一个块相关联。“缓冲区”作为对象,表示内存中的磁盘块。

“ buffer”是单个物理磁盘块的内存表示形式。

块 I/O 操作一次操作一个磁盘块。常见的块 I/O 操作是读写 inode。内核提供了 bread ()函数,用于从磁盘执行对单个块的低级读取。通过‘缓冲区’,磁盘块被映射到它们相关的内存中页面。”

红帽子解释:

缓存页面:

缓存是内存的一部分,它透明地存储数据,以便将来对该数据的请求能够得到更快的处理。这个内存被内核用来缓存磁盘数据和提高 i/o 性能。

Linux 内核的构建方式是,它将使用尽可能多的 RAM 来缓存来自本地和远程文件系统和磁盘的信息。随着时间的推移,系统上执行了各种读写操作,内核试图将运行在系统上的各种进程的数据或将在不久的将来使用的相关进程的数据保存在内存中。当进程停止/退出时,缓存不会被回收,但是当其他进程需要比可用内存更多的内存时,内核将运行启发式方法,通过存储缓存数据并将该内存分配给新进程来回收内存。

当任何类型的文件/数据被请求时,内核将寻找用户操作的文件部分的一个副本,如果没有这样的副本存在,它将分配一个新的缓存内存页面,并用从磁盘读出的适当内容填充它。

存储在缓存中的数据可能是以前计算过的值,也可能是存储在磁盘其他位置的原始值的副本。当请求某些数据时,首先检查缓存是否包含该数据。从缓存中检索数据比从源数据源检索数据更快。

虽然 SysV 共享内存段不表示磁盘上的任何数据,但它们也被计为缓存。可以使用 ipcs-m 命令检查共享内存段的大小,并检查字节列。

缓冲区:

缓冲区是存储在页缓存下的数据的磁盘块表示形式。缓冲区包含驻留在页面缓存下的文件/数据的元数据。 示例: 当对页面缓存中的任何数据发出请求时,内核首先检查包含指向页面缓存中包含的实际文件/数据的元数据的缓冲区中的数据。一旦从元数据中知道了文件的实际块地址,就由内核提取它进行处理。

引自书中: 信息检索入门

缓存

我们希望在内存中保存尽可能多的数据,特别是那些需要经常访问的数据。我们称之为将经常使用的磁盘数据保存在主内存缓存中的技术。

缓冲器

操作系统通常读写整个块。因此,从磁盘读取一个字节所花的时间与读取整个块所花的时间相同。块大小分别为8、16、32和64 KB。我们调用主存储器的一部分,其中正在读取或写入的块被存储为缓冲区。

Cache: 这是内核在物理 RAM 上获取的一个位置,用于在缓存中存储页面。现在我们需要某种索引来获取缓存中页面的地址。这里我们需要保存页缓存元数据的页缓存的缓冲区。

对于初学者来说,一般的概念是有帮助的,缓冲区是一个内存区域,用于在从一个地方移动到另一个地方时临时存储数据。另一方面,缓存是一个临时存储区域,用于存储经常访问的数据以便快速访问。

Linux: Linux 中的缓存称为页面缓存。内核为缓存文件系统磁盘访问而保留的系统内存就是这个数量。这是为了使整体性能更快。在 Linux 读取系统调用期间,内核检查缓存是否包含请求的数据块。如果是这样,那么这将是一个成功的缓存命中。缓存在不对磁盘系统执行任何 I/O 的情况下返回这些数据。Linux 缓存方法称为回写缓存。这意味着首先,数据被写入缓存内存并标记为脏,直到与磁盘同步。然后,内核维护内部数据结构,以优化在缓存需要任何额外空间时从缓存中清除哪些数据。例如,当内存使用达到某个阈值时,后台任务开始将脏数据写入磁盘,从而清空内存缓存。 与访问(实际)内存相比,从磁盘读取数据非常慢。此外,通常在相对较短的时间内多次读取磁盘的同一部分。例如,可以首先读取电子邮件,然后在回复时将信件读入编辑器,然后在将其复制到文件夹时让邮件程序再次读取。或者,考虑一下命令 ls 在有多个用户的系统上运行的频率。通过只从磁盘读取一次信息,然后将其保存在内存中,直到不再需要为止,可以加快除第一次读取之外的所有操作。这称为磁盘缓冲,用于此目的的内存称为缓冲区缓存。

来自 free的手册页:


DESCRIPTION
free  displays  the  total amount of free and used physical and swap memory in the system, as well as the buffers and caches used by the
kernel. The information is gathered by parsing /proc/meminfo. The displayed columns are:


total  Total installed memory (MemTotal and SwapTotal in /proc/meminfo)


used   Used memory (calculated as total - free - buffers - cache)


free   Unused memory (MemFree and SwapFree in /proc/meminfo)


shared Memory used (mostly) by tmpfs (Shmem in /proc/meminfo)


buffers
Memory used by kernel buffers (Buffers in /proc/meminfo)


cache  Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)


buff/cache
Sum of buffers and cache


available
Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache
or  free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to
items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same  as
free)