Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

在Linux 2.6的内核中Page cache和Buffer cache进一步结合,Buffer pages其实也是Page cache里面的页。从Linux算法实现的角度,Page cache和Buffer cache目前是一样的,只是多了一层抽象,通过buffer_head来进行一些访问管理。可以理解为只有Page cache概念亦可。在Linux 2.6的内核中Page cache和Buffer cache进一步结合,Buffer pages其实也是Page cache里面的页。从Linux算法实现的角度,Page cache和Buffer cache目前是一样的,只是多了一层抽象,通过buffer_head来进行一些访问管理。可以理解为只有Page cache概念亦可。

标准IO:

在 Linux 中,这种访问文件的方式是通过两个系统调用实现的:read() 和 write()。当应用程序调用 read() 系统调用读取一块数据的时候,如果该块数据已经在内存中了,那么就直接从内存中读出该数据并返回给应用程序;如果该块数据不在内存中,那么数据会被从磁盘上读到页高缓存中去,然后再从页缓存中拷贝到用户地址空间中去。如果一个进程读取某个文件,那么其他进程就都不可以读取或者更改该文件;对于写数据操作来说,当一个进程调用了 write() 系统调用往某个文件中写数据的时候,数据会先从用户地址空间拷贝到操作系统内核地址空间的页缓存中去,然后才被写到磁盘上。但是对于这种标准的访问文件的方式来说,在数据被写到页缓存中的时候,write() 系统调用就算执行完成,并不会等数据完全写入到磁盘上。Linux 在这里采用的是我们前边提到的延迟写机制( deferred writes )。如果用户采用的是延迟写机制( deferred writes ),那么应用程序就完全不需要等到数据全部被写回到磁盘,数据只要被写到页缓存中去就可以了。在延迟写机制的情况下,操作系统会定期地将放在页缓存中的数据刷到磁盘上。

直接IO:

凡是通过直接 I/O 方式进行数据传输,数据均直接在用户地址空间的缓冲区和磁盘之间直接进行传输,完全不需要页缓存的支持。操作系统层提供的缓存往往会使应用程序在读写数据的时候获得更好的性能,但是对于某些特殊的应用程序,比如说数据库管理系统这类应用,他们更倾向于选择他们自己的缓存机制,因为数据库管理系统往往比操作系统更了解数据库中存放的数据,数据库管理系统可以提供一种更加有效的缓存机制来提高数据库中数据的存取性能。

简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

补充一点,在文件系统层每个设备都会分配一个def_blk_ops的文件操作方法,这是设备的操作方法,在每个设备的inode下面会存在一个radix tree,这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统,那么会生成一个inode,这个inode会分配ext3_ops之类的操作方法,这些方法是文件系统的方法,在这个inode下面同样存在一个radix tree,这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出,2.6内核中的buffer cache和page cache在处理上是保持一致的,但是存在概念上的差别,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已。

"如果一个进程读取某个文件,那么其他进程就都不可以读取或者更改该文件;" 对这一句话存在质疑。

原文

http://blog.chinaunix.net/uid-1829236-id-3152172.html

Page cache和Buffer cache相关推荐

  1. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  2. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  3. Page cache和Buffer cache[转1]

    http://www.cnblogs.com/mydomain/archive/2013/02/24/2924707.html Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的 ...

  4. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

  5. linux page buffer cache深入理解

    Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][1] = ...

  6. linux cache and buffer【转】

    转自:http://blog.csdn.net/turkeyzhou/article/details/6426738 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux下对文件的访问和设 ...

  7. Linux buffer/cache解读

     cache与buffer解读 cache出现的原因与功能 计算机硬件中CPU.内存.磁盘是最主要的三大部分,其中,CPU发展到今天,执行速度最快,而内存相对CPU而言,就慢多了,CPU执行的指令是从 ...

  8. linux内核学习6:Linux的CPU高速缓存cache和页高速缓存cache,buffer

    一.CPU高速缓存(cache) 参考:https://blog.csdn.net/u014470361/article/details/80060701 参考:https://blog.csdn.n ...

  9. postgresql_internals-14 学习笔记(五)Buffer Cache

    新年的第一篇博客~ 一. Buffer Cache简介 1. 主要用途 调和内存(ns级)与磁盘(ms级)间的速度差异. pg不仅用自己的buffer cache,也用os cache,所以它使用了& ...

最新文章

  1. windows socket编程入门示例3
  2. python之Scrapy框架的第一个爬虫
  3. Red Hat Linux、rhel 和 Fedora Core 以及 Centos 区别与联系
  4. java冒泡排序,选择排序,插入排序,希尔排序
  5. count/distinct/group by的用法总结
  6. Day03-卷积神经网络原理与使用
  7. 2018提高组训练Day2
  8. 详解ISA2006三种客户端
  9. 浏览器自动化操作标准--WebDriver
  10. Mina学习之搭建项目工程目录
  11. Linux|麒麟操作系统实现多路RTMP|RTSP播放
  12. Spring之控制反转(IOC)
  13. openh264限制slice/nal分片大小导致的编码数据错误
  14. 一元钱一瓶汽水,喝完后两个空瓶能换一瓶汽水,问:你有20元钱,可以喝到几瓶汽水?
  15. Unity Metaverse(六)、关于Avatar换装系统的示例工程
  16. Hive中4个By Sort By 、Order By、Distrbute By、 Cluster By区别
  17. Android中获取屏幕信息的几种方式
  18. 2021年中国影院行业发展现状:院线影院规模集中度持续增强,票房前五名排名保持稳固[图]
  19. 使用Swagger管理API
  20. 台式计算机打字标准手法,怎样才能练好标准的打字方法?电脑键盘打字指法教学...

热门文章

  1. tomcat下多个app 不同的图标_iOS平台设计规范(五)图标与图片
  2. linux java setting,setting java_home and path environmental variables in linux [duplicate]
  3. api接口怎么分批传递数据_新手上路:浅谈什么是API接口 API定义是什么
  4. 自动化测试常用python库_Python自动化测试常用库
  5. c语言多线程详,如何用C语言实现多线程
  6. office2019安装Mathtype7.4运行时错误‘53’,文件未找到:MathPage.WLL
  7. python3 x和python2 x区别_Python3.x和Python2.x的区别(转存参考)
  8. c语言基础教程吕答案,全国计算机等级考试二级教程C语言程序设计课后习题答案.docx...
  9. linux led测试程序,Linux中加入led驱动及测试程序详解
  10. mysql 函数修改无效_MySQL:无效使用组函数