在现代计算机系统中,CPU,RAM,DISK的速度不相同,按速度高低排列 为:CPU>RAM>DISK。CPU与RAM之间、RAM与DISK之间的速度差异常常是指数级。同时,它们之间的处理容量也不相同,其差异也是指数级。为了在速度和容量上折中,在CPU与RAM之间使用CPU cache以提高访存速度,在RAM与磁盘之间,操作系统使用page cache提高系统对文件的访问速度。

操作系统在处理文件时,需要考虑两个问题:

1.      存放在磁盘上的文件读写速度比内存差了一个数量级。
2.      文件加载到内存一次,供多个程序共享。

例如,在Windows系统中,一个进程中常常包含各种系统DLL模块,其大约占用15MB空间,如果这些DLL不被共享,将会占用大量的系统内存。

操作系统使用page cache机制解决上面的两个问题。

以下是一个应用程序事例,在linux下, render进程对sence.dat文件的操作步骤如下:

当render程序从sence.dat中读取了12KB数据之后,系统的页面内存可能如下:

对于系统的所有文件I/O请求,操作系统都是通过page cache机制实现的,对于操作系统而言,磁盘文件都是由一系列的数据块顺序组成,数据块的大小随系统不同而不同,x86 linux系统下是4KB(一个标准页面大小)。内核在处理文件I/O请求时,首先到page cache中查找(page cache中的每一个数据块都设置了文件以及偏移信息),如果未命中,则启动磁盘I/O,将磁盘文件中的数据块加载到page cache中的一个空闲块。之后再copy到用户缓冲区中。

很明显,同一块文件数据,在内存中保存了两份,这既占用了不必要的内存空间、冗余的拷贝、以及造成的CPU cache利用率不高。针对此问题,操作系统提供了内存映射机制(linux中mmap、windows中Filemapping)。如下图:

在使用mmap调用时,系统并不是马上为其分配内存空间,而仅仅是添加一个VMA到该进程中,当程序访问到目标空间时,产生缺页中断。在缺页中断中,从pagecaches中查找要访问的文件块,若未命中,则启动磁盘I/O从磁盘中加载到pagecaches。然后将文件块在pagecaches中的物理页映射到进程mmap地址空间。

当程序退出或关闭文件时,系统是否会马上清除page caches中的相应页面呢?答案是否定的。由于该文件可能被其他进程访问,或该进程一段时间后会重新访问,因此,在物理内存足够的情况下,系统总是将其保持在page caches中,这样可以提高系统的整体性能(提高page caches的命中率,尽量少的访问磁盘)。只有当系统物理内存不足时,内核才会主动清理page caches。

当进程调用write修改文件时,由于page cache的存在,修改并不是马上更新到磁盘,而只是暂时更新到page caches中,同时mark 目标page为dirty,当内核主动释放pagecaches时,才将更新写入磁盘(主动调用sync时,也会更新到磁盘)。

Filemapping可以是共享或私有的。对于共享的Filemapping,情况较简单。多个进程mmap映射到相同的pagecache。

当filemapping为私有的时,为了防止一个进程修改操作影响到另一个进程,处理情形如下图:

操作系统中的page cache机制相关推荐

  1. Linux Page Cache机制

    1 .前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与Windows .UNIX 一起占据了操作系统领域几乎所有的市场份额.特别是在高性能计 ...

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

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

  3. HTTP请求中的缓存(cache)机制

    当资源第一次被访问的时候,HTTP头部如下 (Request-Line) GET /a.html HTTP/1.1 Host    127.0.0.1 User-Agent  Mozilla/5.0 ...

  4. Java 中常用缓存Cache机制的实现

    /* *所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. *内存缓存,也就是实现一个类中静态Map,对 ...

  5. java cache教程_Java 中常用缓存Cache机制的实现

    缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map ...

  6. Linux读写缓存Page Cache

    一. 读写缓存Page Cache Linux对文件读写并不是每次都进行磁盘IO,而是将对应的磁盘文件缓存到内存上,之后对该文件的操作实际上也是对内存的读写. 缓存俗称页缓存(page cache), ...

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

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

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

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

  9. Page Cache引起的业务问题处理

    在工作中,你可能遇见过与 Page Cache 有关的场景,比如: 服务器的 load 飙高: 服务器的 I/O 吞吐飙高: 业务响应时延出现大的毛刺: 业务平均访问时延明显增加. 这些问题,很可能是 ...

最新文章

  1. 深度学习的第一性原理!
  2. 单独的plsql链接数据库
  3. 网络化机房的绿色安全卫士——万联OMM网络化机房动力环境监控系统案例分析...
  4. 使用Java进行串口SerialPort通讯
  5. mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?
  6. linux怎么添加头文件目录下,linux下编写c++,include的那些头文件在什么地方?
  7. git、github、gitlab、gitee的区别
  8. java并发初探ConcurrentSkipListMap
  9. 使用useEffect常见问题!
  10. 图解tcpip 第5版 pdf_现代实用气动技术 第2版 pdf下载 0776
  11. class文件不能反编译
  12. 十年,MongoDB从一片小绿叶长成一颗大树
  13. 数据库原理及应用实验
  14. 杭州电子科技大学acm---2007
  15. 不忘初心,持之以恒,笔耕不辍,利人利己
  16. 使用inkscape制作logo
  17. php在线考试系统 附源码(一)
  18. http报文格式简介
  19. Win10早期版本下月终止服务、百万医疗设备存在漏洞风险|11月10日全球网络安全热点
  20. [Android] ListView实现隔行变色(一)

热门文章

  1. 逻辑运算符(LogicalOperator)
  2. php测试系统登录超时,thinkphp后台检测用户登录超时的实现方法
  3. docker compose mysql_docker-compose部署MySQL
  4. java content-length_为什么Content-Length HTTP头字段使用的值不是Java代码中给出的值?...
  5. 数据逻辑讨论计算机,1绪论信息技术算法与程序福建教师招考.ppt
  6. java实现背包问题例子_动态规划(背包问题)java实现
  7. 求两个点的欧氏距离_数据智能系列(五)| 距离的秘密
  8. 光电编码器的原理及应用场合_图解编码器应用,推荐收藏
  9. 小程序 web socket_程序员的薪水和发展方向大全
  10. lisp将图元追加选择_DNF:哈林防具和海博伦如何选择首饰提升率最大?你选对了吗?...