Linux中缓冲区与缓存内存有什么区别?

时间:2011-06-14 14:20:38

标签: linux caching memory buffer

对我而言,目前尚不清楚两种Linux内存概念之间的区别:buffercache。我已阅读this post,在我看来,它们之间的区别在于到期政策:

  1. 缓冲区的策略是先进先出
  2. 缓存的策略是最近最少使用的。
  3. 我是对的吗?

    特别是,我正在查看两个命令: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
    

12 个答案:

答案 0 :(得分:162)

  

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

quote link

答案 1 :(得分:77)

Cited answer (for reference):

  

简答:缓存是页面缓存的大小。缓冲区是内存块I / O缓冲区的大小。缓存事项;缓冲区在很大程度上是无关紧要的。

     

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

     

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

答案 2 :(得分:64)

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

引自:

答案 3 :(得分:20)

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

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

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

答案 4 :(得分:12)

缓冲区和缓存。

缓冲区尚未“写入”磁盘。

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

答案 5 :(得分:9)

RedHat 解释:

缓存页面:

缓存是内存的一部分,它透明地存储数据,以便可以更快地提供对该数据的未来请求。内核利用此内存来缓存磁盘数据并提高I / O性能。

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

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

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

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

缓冲区:

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

答案 6 :(得分:8)

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

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

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

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

答案 7 :(得分:3)

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

我在本书的第2版中找到了一些关于'缓冲'的内容。

  

尽管物理设备本身可以在扇区级别进行寻址,但内核会根据块执行所有磁盘操作。

     

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

     

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

     

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

答案 8 :(得分:2)

缓冲区包含有助于提高写入性能的元数据

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

这本书的语录: Introduction to Information Retrieval

缓存

  

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

缓冲区

  

操作系统通常读取和写入整个块。因此,从磁盘读取单个字节可能会花费与读取整个块相同的时间。常见的块大小有8、16、32和64 KB。我们称主存储器中存储正在读取或写入的块的部分为缓冲区。

答案 11 :(得分:0)

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