Linux中的缓冲区和高速caching之间有什么区别?

对我来说,并不清楚两个Linux内存概念之间的区别: buffercache 。 我已经阅读了这篇文章 ,在我看来,他们之间的差异是到期政策:

  1. 缓冲区的政策是先入先出
  2. caching的策略是最近最less使用的。

我对吗?

特别是,我正在看两个命令: freevmstat

 james@utopia:~$ vmstat -SM procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rb 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 

“缓冲区”表示RAM的多less部分专用于caching磁盘块。 “caching”类似于“缓冲区”,只是这次它caching从文件阅读页面。

来自:

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

报价链接

引用答案(供参考):

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

长答案:caching是Linux页面caching的大小,减去交换caching中由SwapCached表示的内存(因此整个页面caching大小为Cached + SwapCached)。 Linux通过页面caching执行所有文件I / O。 写入被实现为简单地将页面caching中的相应页面标记为脏的; 冲洗线程然后周期性地将任何脏页面写回磁盘。 读取是通过从页面caching返回数据来实现的; 如果数据尚未在caching中,则首先填充数据。 在现代Linux系统上,Cached可以很容易地达到几千兆字节。 它只会因内存压力而缩小。 系统将清除页面caching,并将数据交换到磁盘以根据需要提供更多的内存。

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

这并不像这样简单,但是可能有助于理解:

缓冲区用于存储文件元数据(权限,位置等)。 每个内存页面都在这里跟踪。

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

缓冲区和caching。

缓冲区是还没有被写入磁盘的东西。

caching是从磁盘“读取”并存储起来以备后用的东西。

我想这个页面将有助于深入了解缓冲区和caching之间的区别。 http://www.tldp.org/LDP/sag/html/buffer-cache.html

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

由于不幸的是,内存是一个有限的,稀缺的资源,所以缓冲区caching通常不够大(它不能容纳所有想要使用的数据)。 当caching填满时,最长时间未使用的数据被丢弃,这样释放的内存被用于新数据。

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

缓冲区包含有助于提高写入性能的元数据caching包含文件内容本身(有时尚未写入磁盘),从而提高了读取性能

Seth Robertson的Link 2表示:“为了彻底理解这些术语,请参阅Robert M. Love撰写的”Linux内核开发“一书。

我在本书的第二版中发现了一些关于“缓冲区”的内容。

虽然物理设备本身在扇区级别是可寻址的,但内核将按块执行所有的磁盘操作。

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

“缓冲区”是单个物理磁盘块的内存中表示。

块I / O操作一次处理一个磁盘块。 常见的块I / O操作是读取和写入inode。 内核提供了bread()函数来执行从磁盘读取单个块的低级别。 通过“缓冲区”,磁盘块被映射到其关联的内存页面。 “

RedHat解释说:

caching页面:

caching是透明地存储数据的存储器的一部分,以便将来对该数据的请求可以更快地被服务。 该内存被内核用来caching磁盘数据并提高I / O性能。

Linux内核的构build方式是尽可能多地使用RAM来caching来自本地和远程文件系统和磁盘的信息。 随着时间的推移,在系统上执行各种读取和写入操作,内核会尝试将存储在系统中正在运行的各种进程或近期将要使用的相关进程的数据的数据存储在内存中。 当进程得到停止/退出时,高速caching不被回收,但是当其他进程需要更多的内存,然后空闲的可用内存时,内核将运行启发式方法,通过存储高速caching数据并将该内存分配给新进程来回收内存。

当请求任何types的文件/数据时,内核将查找用户正在操作的文件部分的副本,并且如果不存在这样的副本,则它将分配一个新的高速caching存储器页并填充从磁盘读出适当的内容。

存储在caching中的数据可能是先前计算的值,或者存储在磁盘其他位置的原始值的重复值。 当请求某些数据时,首先检查caching是否包含该数据。 数据可以从caching中获取,而不是从源头获取。

SysV共享内存段也被认为是caching,尽pipe它们并不代表磁盘上的任何数据。 可以使用ipcs -m命令检查共享内存段的大小并检查字节列。

缓冲区:

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

缓冲区是一个内存区域,用于在计算机内从一个地方移动到另一个地方时临时保存数据。而caching是临时存储区域,可以存储频繁访问的数据以便快速访问。 一旦数据存储在caching中,将来可以通过访问caching副本而不是重新获取原始数据来实现,从而平均访问时间更短。