一、 读写缓存Page Cache

Linux对文件读写并不是每次都进行磁盘IO,而是将对应的磁盘文件缓存到内存上,之后对该文件的操作实际上也是对内存的读写。

缓存俗称页缓存(page cache),而被修改过但还没写入磁盘的页缓存称为脏页(dirty page)。页缓存可以通过/proc/meminfo查看,页缓存为Cached,脏页为Dirty。

上图中,红色部分为 Page Cache。Page Cache 的本质是由 Linux 内核管理的内存区域。通过 mmap 以及 buffered I/O 将文件读取到内存空间实际上都是读取到 Page Cache 中。

二、 Linux中 Read、Write的过程

  • Read
    当我们使用read去读取文件时,操作系统会先从缓存中查找对应文件,如果没有找到则产生缺页中断,将文件读取到缓存中,同时用户read过程也会被阻塞。如果命中,则直接读取缓存内容。

  • Write
    同理,write调用也会先将数据写入缓存,如果没有找到指定缓存则产生缺页中断,将磁盘文件读取到缓存,write再修改缓存内容。如果命中,则直接写入到缓存。

磁盘回写

由pdflush进程定时将脏页写入磁盘,周期为/proc/sys/vm/dirty_writeback_centisecs,单位是(1/100)厘秒(centi seconds)

调用fsync()进行回写,这时候系统会唤醒pdflush直到所有的脏页都已经写到磁盘为止

内存不足或脏页过多,write系统调用会同样会唤醒pdflush回写

三、 预读取readahead及内存映射mmap

1、 预读取readahead

readahead预读取,其实就是让操作系统将对应的文件读取到缓存,之后read就不会产生缺页中断。缺页中断时操作系统会将磁盘文件写入缓存,此时read过程被阻塞。

操作系统为基于 Page Cache 的读缓存机制提供预读机制(PAGE_READAHEAD):

用户线程仅仅请求读取磁盘上文件 A 的 offset 为 0-3KB 范围内的数据,由于磁盘的基本读写单位为 block(4KB),于是操作系统至少会读 0-4KB 的内容,这恰好可以在一个 page 中装下

但是操作系统出于局部性原理会选择将磁盘块 offset [4KB,8KB)、[8KB,12KB) 以及 [12KB,16KB) 都加载到内存,于是额外在内存中申请了 3 个 page

上图中,应用程序利用 read 系统调动读取 4KB 数据,实际上内核使用 readahead 机制完成了 16KB 数据的读取。

2、 内存映射 mmap

通过内存映射的方式,将文件直接映射到进程的地址空间。之后对文件的读写就可以通过指针的方式读取映射的内存空间。

当用户第一次读取文件时会产生缺页中断,操作系统将文件读取到缓存,之后读取就直接读取缓存,那缓存什么时候写回磁盘?这个不用管,操作系统会自动管理。

上图中 mmap()系统调用原理:mmap的作用是映射文件描述符和指定文件的(off_t off)区域至调用进程的(addr,addr *len)的内存区域。

优点:不用调用系统函数read、write减少系统调用开销;内存映射减少了一次内存拷贝,正常read操作是两次数据拷贝,第一次将磁盘写到缓存,第二次是将缓存写入read传递的buffer里。

转自:Linux读写缓存Page Cache

Linux读写缓存Page Cache相关推荐

  1. 关于Linux的缓存内存 Cache Memory详解

    30 (总结)关于Linux的缓存内存 Cache Memory详解 发表于: Linux, UNIX, 个人日记, 原创总结 | 作者: 谋万世全局者 标签: cache,Linux,Memory, ...

  2. linux清空buff,linux 清理缓存buff/cache

    清理缓存 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys ...

  3. linux 编译缓存,Linux磁盘缓存(disk cache)详解

    在Linux系统里通过free命令,我们经常可以看到类似下面的输出: $ free -m total used free shared buffers cached Mem: 24097 21665 ...

  4. linux磁盘读写缓存,linux读写缓存

    1. 操作系统缓存 在linux世界里,一切可读写设备都可看作是文件.文件cache设计的好坏直接影响着文件系统和磁盘的性能.最直观的是使用free命令看到的cached列. 这里面的cached列就 ...

  5. 文件缓存page cache

    address_space结构  host:指向当前 address_space 对象所属的文件 inode 对象 page_tree:用于存储当前文件的 页缓存 rb_boot i_mmap存储着共 ...

  6. 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files

    原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...

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

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

  8. Linux的Page Cache

    1. Page Cache 何为Page Cache 为了了解Page Cache我们可以看一下Linux的文件I/O系统 从图中可以看出,Page Cache是由Linux内核进行管理的,而且通过m ...

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

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

最新文章

  1. nginx的HTTP模块编写
  2. 001_FastDFS介绍
  3. Day004_Linux基础命令之特殊符号与正则表达式通配符
  4. java isodate格式_fmt:formatDate的输出格式详解
  5. @valid 不生效_黑帽seo高手-实战细谈301生效周期+影响收录重要因素(探索)
  6. 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)
  7. 信息学奥赛一本通(1281:最长上升子序列)
  8. 时光就是一颗巨大的牛轧糖
  9. Mac OS X / IOS 内存管理机制简要说明
  10. Qt 程序访问 sqlite 权限错误
  11. hadoop yarn 集群配置
  12. 哈佛MIT联手出品 | 造价低于1美元的机械臂,可承自身重量千倍
  13. java中 t无法对齐,java – 即使X应匹配T,也无法将X转换为T?
  14. ionic在app内部打开pdf文件
  15. VIP视频会员,无限制看剧对人的自制力,产生了严重的考验和折磨
  16. MYSQL排序加分页报错Out of sort memory, consider increasing server sort buffer size
  17. Python之父:Python 4.0可能不会有了
  18. 【测试源】bbb_sunflower_1080p_30fps_normal.mp4 等下载地址
  19. 各类后门整理!【白帽黑客必备生存技能】
  20. shell高级编程笔记(第九章 变量重游)

热门文章

  1. 类Array对象中是否该直接使用Array的原型方法?
  2. 任正非:华为三十年大限快到了,想不死就得新生
  3. 南阳14(会场安排问题)
  4. linux访问windows共享目录开机自动挂载
  5. Django搭建个人博客:文章标签功能
  6. 如何查看本机安装的python支持哪种.whl文件
  7. Docker CE for CentOS的安装(对官方文档的翻译)
  8. Ubuntu 16.04安装UML工具StarUML 2
  9. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理
  10. apache正向代理配置