惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
A
About on SuperTechFans
D
DataBreaches.Net
量子位
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss
U
Unit 42
M
MIT News - Artificial intelligence
小众软件
小众软件
博客园 - Franky
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Help Net Security
Help Net Security
Recorded Future
Recorded Future
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
S
Security @ Cisco Blogs
MongoDB | Blog
MongoDB | Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
IT之家
IT之家
L
LINUX DO - 热门话题
H
Hacker News: Front Page
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
S
Schneier on Security
Scott Helme
Scott Helme
Microsoft Security Blog
Microsoft Security Blog
Attack and Defense Labs
Attack and Defense Labs
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Know Your Adversary
Know Your Adversary

博客园 - 山本二十八

【转】ext4+delalloc造成单次写延迟增加的分析 write 系统调用耗时长的原因 【转】通过blktrace, debugfs分析磁盘IO win7 wifi热点 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap pdflush进程介绍与优化【转】 How to find per-process I/O statistics on Linux oom_killer 磁盘性能统计 利用ftrace跟踪内核static tracepoint Tracing on Linux 【转】ftrace 简介 fio使用 linux分区 局部标签(gcc对c的扩展) Valgrind查找内存泄露利器 取得进程信息 打印堆栈信息 shell调试技术
buffer与cache的区别
山本二十八 · 2013-11-20 · via 博客园 - 山本二十八

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)当访问一个单独的磁盘块时(例如,当读超级块或索引节点块时)。