Linux读写缓存Page Cache
一、 读写缓存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相关推荐
- 关于Linux的缓存内存 Cache Memory详解
30 (总结)关于Linux的缓存内存 Cache Memory详解 发表于: Linux, UNIX, 个人日记, 原创总结 | 作者: 谋万世全局者 标签: cache,Linux,Memory, ...
- linux清空buff,linux 清理缓存buff/cache
清理缓存 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys ...
- linux 编译缓存,Linux磁盘缓存(disk cache)详解
在Linux系统里通过free命令,我们经常可以看到类似下面的输出: $ free -m total used free shared buffers cached Mem: 24097 21665 ...
- linux磁盘读写缓存,linux读写缓存
1. 操作系统缓存 在linux世界里,一切可读写设备都可看作是文件.文件cache设计的好坏直接影响着文件系统和磁盘的性能.最直观的是使用free命令看到的cached列. 这里面的cached列就 ...
- 文件缓存page cache
address_space结构 host:指向当前 address_space 对象所属的文件 inode 对象 page_tree:用于存储当前文件的 页缓存 rb_boot i_mmap存储着共 ...
- 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files
原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...
- 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...
- Linux的Page Cache
1. Page Cache 何为Page Cache 为了了解Page Cache我们可以看一下Linux的文件I/O系统 从图中可以看出,Page Cache是由Linux内核进行管理的,而且通过m ...
- linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...
最新文章
- nginx的HTTP模块编写
- 001_FastDFS介绍
- Day004_Linux基础命令之特殊符号与正则表达式通配符
- java isodate格式_fmt:formatDate的输出格式详解
- @valid 不生效_黑帽seo高手-实战细谈301生效周期+影响收录重要因素(探索)
- 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)
- 信息学奥赛一本通(1281:最长上升子序列)
- 时光就是一颗巨大的牛轧糖
- Mac OS X / IOS 内存管理机制简要说明
- Qt 程序访问 sqlite 权限错误
- hadoop yarn 集群配置
- 哈佛MIT联手出品 | 造价低于1美元的机械臂,可承自身重量千倍
- java中 t无法对齐,java – 即使X应匹配T,也无法将X转换为T?
- ionic在app内部打开pdf文件
- VIP视频会员,无限制看剧对人的自制力,产生了严重的考验和折磨
- MYSQL排序加分页报错Out of sort memory, consider increasing server sort buffer size
- Python之父:Python 4.0可能不会有了
- 【测试源】bbb_sunflower_1080p_30fps_normal.mp4 等下载地址
- 各类后门整理!【白帽黑客必备生存技能】
- shell高级编程笔记(第九章 变量重游)