目录

文章目录

  • 目录
  • 无处不在的 Cache
  • Cache 和 Buffer 的区别在哪里?
  • 为什么需要缓存?
  • Linux 的缓存机制
  • Page Cache 的同步机制(一致性问题)

无处不在的 Cache

限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型。越往塔顶,存取效率越高、但成本也越高,所以容量也就越小。得益于程序访问的局部性原理,这种节省成本的做法也能取得不俗的运行效率。从存储器的层次结构以及计算机对数据的处理方式来看,上层一般作为下层的 Cache 层来使用(广义上的 Cache)。

比如寄存器缓存 CPU Cache 的数据,CPU Cache L1~L3 层视具体实现彼此缓存或直接缓存内存的数据,而内存往往缓存来自本地磁盘的数据。本文主要讨论磁盘 IO 操作,故只聚焦于 Local Disk 的访问特性和其与 DRAM 之间的数据交互。

Cache 和 Buffer 的区别在哪里?

Cache 和 Buffer 是两个不同的概念,简单的说,Cache 是加速 “读”,而 Buffer 是缓冲 “写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为 buffer/ cache。

为什么需要缓存?

可以看到,CPU 最快,一个时钟周期是 0.3 纳秒,内存访问需要 120 纳秒,固态硬盘访问需要 50-150 微秒,传统硬盘访问需要 1-10 毫秒, 网络访问最慢,都是几十毫秒。

如果一个时钟周期如果按 1 秒算:

  • 内存访问就是 6 分钟
  • 固态硬盘是 2-6 天
  • 传统硬盘是 1-12 个月
  • 网络访问就是几年了!

如果你是 CPU,你会觉得这个世界真是慢死了!从硬盘访问数据得等待 “几天” 甚至 “几个月”!


所以存储器的层级关系出来了,存储器越往上速度越快,但是价格越来越贵, 越往下速度越慢,但是价格越来越便宜。

Linux 的缓存机制

在 Linux 系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓存区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。

  • buffers 用来缓存 metadata 及 pages,可以理解为系统缓存,例如:vi 打开一个文件。

  • cached 用来给文件做缓存,可以理解为数据块缓存,例如:dd if=/dev/zero of=/tmp/test count=1bs=1G 测试写入一个文件,就会被缓存到缓冲区中,当下一次再执行这个测试命令时,写入速度会明显很快。

  • Swap 是交换分区,即通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到 Swap 中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到 Swap。

缓存机制优点: 减少系统调用次数,降低 CPU 上下文切换和磁盘访问频率。

CPU上下文切换: CPU 给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。

查看到系统内存的使用情况:

可以看出,系统内存为 16G,Swap 内存 16G,mem free 虽然显示为 1118,因缓存的存在,不能认为系统目前内剩下这么多内存。而应该把 buffers、cached 的也算上,即 free+cached+buffers=1118+7110+430=8658,总内存再减去 8658=7314,与 buffers/cache 行中对应 free 列的 7312 和 8659 基本一致。

Page Cache 的同步机制(一致性问题)

广义上 Cache 的同步方式有两种,即 Write Through(写穿)和 Write back(写回)。从名字上就能看出这两种方式都是从写操作的不同处理方式引出的概念,单存读不存在 Cache 一致性问题。

对应到 Linux 的 Page Cache 上所谓 Write Through 就是指 write 操作将数据拷贝到 Page Cache 后立即和下层进行同步的写操作,完成下层的更新后才返回。而 Write back 正好相反,指的是写完 Page Cache 就可以返回了。Page Cache 到下层的更新操作是异步进行的。

Linux 下 Buffered IO 默认使用的是 Write back 机制,即文件操作的写只写到 Page Cache 就返回,之后 Page Cache 到磁盘的更新操作是异步进行的。Page Cache 中被修改的内存页称之为脏页(Dirty Page),脏页在特定的时候被一个叫做 pdflush(Page Dirty Flush)的内核线程写入磁盘,写入的时机和条件如下:

  • 当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。
  • 当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘。
  • 用户进程调用 sync、fsync、fdatasync 系统调用时,内核会执行相应的写回操作。

刷新策略由以下几个参数决定(数值单位均为 1/100 秒):

# flush 每隔 5 秒执行一次
$ sysctl vm.dirty_writeback_centisecs
vm.dirty_writeback_centisecs = 500# 内存中驻留 30 秒以上的脏数据将由 flush 在下一次执行时写入磁盘
$ sysctl vm.dirty_expire_centisecs
vm.dirty_expire_centisecs = 3000若脏页占总物理内存 10% 以上,则触发 flush 把脏数据写回磁盘
$ sysctl vm.dirty_background_ratio
vm.dirty_background_ratio = 10

默认是写回方式,如果想指定某个文件是写穿方式呢?即写操作的可靠性压倒效率的时候,能否做到呢?当然能,除了之前提到的 fsync 之类的系统调用外,在 open 打开文件时,传入 O_SYNC 这个 flag 即可实现。

Linux 操作系统原理 — 内存 — Cache 和 Buffer相关推荐

  1. Linux 操作系统原理 — 内存 — 页式管理、段式管理与段页式管理

    目录 文章目录 目录 前文列表 页式管理 快表 多级页表 基于页表的虚实地址转换原理 应用 TLB 快表提升虚实地址转换速度 页式虚拟存储器工作的全过程 缺页中断 为什么 Linux 默认页大小是 4 ...

  2. Linux 操作系统原理 — 内存 — 内存分配算法

    目录 文章目录 目录 前文列表 内存碎片 伙伴(Buddy)分配算法 Slab 算法 虚拟内存的分配 内核态内存分配 vmalloc 函数 kmalloc 用户态内存分配 malloc 申请内存 用户 ...

  3. Linux 操作系统原理 — 内存 — 基于局部性原理实现的内/外存交换技术

    目录 文章目录 目录 前文列表 基于局部性原理实现的内-外存交换技术 局部性原理 Swap 交换分区 前文列表 <Linux 操作系统原理 - 内存 - 物理存储器与虚拟存储器> < ...

  4. Linux 操作系统原理 — 内存 — 基于 MMU 硬件单元的虚/实地址映射技术

    目录 文章目录 目录 前文列表 物理地址与虚拟地址 内存空间的组织方式 虚拟地址空间的编址 内核态地址空间 用户态地址空间 内-外存空间的交换与虚拟存储空间之间的映射关系 缺页异常 前文列表 < ...

  5. Linux 操作系统原理 — 内存管理 — 虚拟地址空间

    目录 文章目录 目录 虚拟内存技术 页式内存管理技术 虚拟地址格式与页表(32bit 系统) 虚拟地址格式与页表(64bit 系统) CPU MMU 虚实地址转换 TLS 快表转换 虚拟地址空间与 C ...

  6. Linux 操作系统原理 — 内存 — 物理存储器与虚拟存储器

    目录 文章目录 目录 Linux 内存管理全貌 物理存储器 虚拟存储器 Linux 内存管理全貌 物理存储器 见<计算机组成原理 - 存储系统>. 虚拟存储器 在早期的计算机系统中,程序员 ...

  7. Linux 操作系统原理 — 内存 — mmap 进程虚拟内存映射

    目录 文章目录 目录 mmap() mmap 与 read/write 的性能比较 mmap 优点总结 mmap() mmap() 是一个系统调用函数,本质是一种进程虚拟内存的映射方法,可以将一个文件 ...

  8. Linux 操作系统原理 — 内存管理 — 页式内存管理技术

    目录 文章目录 目录 虚拟内存技术 页式内存管理技术 虚拟内存技术 虚拟内存技术是操作系统实现的一种高效的物理内存管理方式,具有以下作用: 使得进程间彼此隔离:通过将物理内存和虚拟地址空间联系起来,并 ...

  9. linux的原理和运用,Linux操作系统原理与应用_内存寻址

    原标题:Linux操作系统原理与应用_内存寻址 第五讲今天上线啦. 在本次课程中,陈老师详细的讲解了有关于内存寻址的演变的相关知识. 第一部分中,介绍了关于内存寻址的相关背景知识.内存寻址-操作系统设 ...

最新文章

  1. SAP MM 模块调研问卷样例
  2. python qthread 线程退出_线程:概念和实现
  3. 普通话计算机考试相关信息,普通话考试常见问题有哪些
  4. putty-psftp
  5. Docker学习笔记之在开发环境中使用服务发现
  6. shell判断IP地址是否合法
  7. python如何读入dat数据_python二进制dat数据怎么转成txt文本
  8. 详解linux下安装python3环境
  9. webstorm使用前的准备——Node.js安装及配置
  10. 扩展类载入器的载入问题
  11. 一张小纸条(软件工程师成长过程中的一些建议)
  12. shp地图如何导入奥维地图手机_如何将平面控制点导入Google Earth、奥维互动地图及手机奥维互动地图APP里面?...
  13. CentOS6.5服务器端口捆绑
  14. PMOS双电源供电隔离电路(USB接入为电池充电 电池断开供电)
  15. java 获取天气_获取免费天气(Java抓取百度天气)
  16. java实现截图功能
  17. StreamWiki: Enabling Viewers of Knowledge SharingLive Streams to Collaboratively Generate Archival
  18. 机器人底盘的核心技术及应用案例
  19. 隐形数字水印_Android 实现图片水印与隐形数字水印
  20. 抖音现在做的竞价推广都是怎么操作的?

热门文章

  1. Kali Linux 安全渗透教程第七更 大学霸1.4.3安装至VMware Workstation
  2. candence的图纸大小设置_在Orcad Cadence中设置原理图页码
  3. 运动想象脑机接口中迁移学习的完整流程
  4. Nilearn教程系列(2)-3D和4D niimgs:处理和可视化
  5. 12岁女孩零编程经验开发系统千人用,80岁初代程序员300多天打卡学AI
  6. 一个小度科技就估值200亿,百度现在被低估了吗?
  7. IDC中国AI服务器报告出炉:浪潮继续蝉联第一,份额超过其他玩家总和
  8. ACL 2019最佳论文出炉:华人团队包揽最佳长短论文一作,中科院、华为等榜上有名...
  9. Java笔试题库之选题题篇【1-70题】
  10. 云原生的浪潮下,为什么运维人员适合学习Go语言?