zoukankan      html  css  js  c++  java
  • buffer与cache的区别

    top命令中有两项与内存相关的东西:buffer和cache。这两项与页高速缓存相关。磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

    在linux内核的旧版本中,主要有两种不同的磁盘高速缓存:页高速缓存(page cache)和缓冲区高速缓存(buffer cache),前者用来存放访问磁盘文件内容时生成的磁盘数据页,后者把通过VFS(管理磁盘文件系统)访问的块的内容保留在内存中。

    从2.4.10的稳定版本开始,缓冲区高速缓存其实就不存在了。事实上,由于效率的原因,不再单独分配块缓冲区;相反,把它们存放在叫做“buffer page”的专门页中,而buffer page保存在页page cache中。

    综上所述,通过vfs访问时,不管是磁盘文件的数据页,还是由vfs发起的对磁盘数据块进行访问时相关的buffer,都是放在page cache

    而如果绕过文件系统,则操作磁盘块时就缓存在buffer cache中。

    比如说,dd of=/dev/null if=/dev/sde1 bs=1024k count=10240,产生的数据就缓存在buffer cache中。

    ============================================================================

        Buffer page形式上就是与“缓冲区首部”的附加描述符相关的数据页,其主要目的是快速确定页中的一个块在磁盘中的地址。实际上,页高速缓存内的页中的一大块数据在磁盘上的地址不一定是相邻的。

        缓冲区首部包含这样的信息:

    struct buffer_head {

          unsigned longb_state;            /* 缓冲区状态标志 */

          struct buffer_head*b_this_page;  /* 指向缓冲区页的链表中的下一个元素的指针 */

          struct page*b_page;              /* 指向拥有该块的缓冲区页的描述符的指针 */

          sector_t b_blocknr;               /* 与块设备相关的块号(起始逻辑块号) */

          size_t b_size;                    /* 块大小 */

          char *b_data;                     /* 块在缓冲区页内的位置 */

          struct block_device*b_bdev;      /* 指向块设备描述符的指针 */

          bh_end_io_t*b_end_io;            /* I/O完成方法 */

           void *b_private;                 /* 指向I/O完成方法数据的指针 */

          struct list_headb_assoc_buffers; /* 为与某个索引节点相关的间接块的链表提供的指针 */

          atomic_t b_count;                 /* 块使用计数器 */

    };

         只要内核必须单独地访问一个块,就要涉及存放块缓冲区的缓冲区页,并检查相应的缓冲区首部。下面是内核创建缓冲区页的两种普通情况:

        (1)当读或写的文件页在磁盘块中不相邻时。发生这种情况是因为文件系统为文件分配了非连续的块,或因为文件有“洞”。

        (2)当访问一个单独的磁盘块时(例如,当读超级块或索引节点块时)。

        

  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/3434209.html
Copyright © 2011-2022 走看看