操作系统:缓存和内存

缓存是什么?

缓存是现代CPU的一部分,它使用的是静态随机存储器(SRAM),缓存的读写速度在寄存器和内存之间作为二者的桥梁。

为什么使用缓存?

因为CPU的处理速度和内存的读写速度差别过大,为了提高CPU利用率在中间使用缓存可以加快数据的获取。

缓存为什么比内存更快?

内存使用的是动态随机存储器(DRAM),在SRAM中,数据的读写操作只需要控制电路的通断状态,而在DRAM中,数据的读写操作需要通过电容的充放电过程,因此速度较慢。

DRAM的存储单元是基于电容的,需要定期刷新以防止数据丢失,这会导致额外的延迟。

SRAM通常能够支持更高的并行访问能力,因为它的存储单元相对独立,可以同时进行多个访问操作。而DRAM的存储单元之间存在耦合效应,因此难以实现高效的并行访问。

为什么内存不使用SRAM?

  • 成本:SRAM的制造成本比DRAM高得多。SRAM的每个存储单元都需要多个触发器和传输门,因此它们的面积更大、需要更多的晶体管。相比之下,DRAM的每个存储单元只需要一个存储电容和一个访问晶体管,因此它们更便宜。
  • 密度:由于SRAM需要更多的晶体管,因此它们的存储密度较低。在同样的芯片面积下,DRAM可以存储更多的数据,因此更适合用于存储大容量的数据。
  • 功耗:SRAM在静态时消耗的功耗相对较高,因为存储单元需要保持电荷以保存数据。相比之下,DRAM只在读取和写入时消耗功耗,静态时消耗的功耗非常低。

缓存机制

  • 缓存命中(Cache Hit):当CPU需要访问数据或指令时,首先检查缓存中是否已经存在所需的数据或指令。如果存在,则发生缓存命中,CPU可以直接从缓存中读取数据或指令,而不需要访问主存。

  • 缓存未命中(Cache Miss):如果缓存中不存在所需的数据或指令,则发生缓存未命中。在这种情况下,CPU需要从主存中加载数据或指令到缓存中,然后再提供给CPU使用。如果主存中的数据或指令也不存在(即主存未命中),则需要从更慢的存储层次中加载,如磁盘或网络存储。

  • 替换策略:当缓存已满且需要替换缓存中的数据时,通常会使用一种替换策略来确定要替换的数据。常见的替换策略包括最近最少使用(LRU)、最不经常使用(LFU)等。

缓存的应用

要想缓存用的好,局部性原理跑不了,缓存按照离cpu的距离和容量分级,缓存离cpu越近容量越小这使得可以更快的读到数据并传输给cpu,栈使用一级缓存堆使用二级缓存,了解过栈帧后就会发现栈的使用是严格遵循局部性原理的,堆的话可能看起来和缓存一点都不搭但是它依旧使用缓存只是缓存的级别不高,站在cpu的角度都是数据不能厚此薄彼。

缓存对运算速度影响挺大的,举个简单的例子快排为什么叫快排,堆排序那么稳定时间复杂度和快排优时间复杂度一致为什么没有快排快呢?这就是因为快排对缓存捕获效果比较好,而堆排序访问数据太跳了。
需要注意的是缓存的命中不是点对点的而是针对点所在的一块区域进行缓存,简称缓存行

相关推荐
你我约定有三2 小时前
MyBatis--缓存详解
spring boot·缓存·mybatis
天涯海风4 小时前
检索增强生成(RAG) 缓存增强生成(CAG) 生成中检索(RICHES) 知识库增强语言模型(KBLAM)
人工智能·缓存·语言模型
m0_595199857 小时前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
智践行13 小时前
ROS2 Jazzy:高效使用回调函数(回调组)
操作系统
智践行13 小时前
ROS2 Jazzy:如何使用节点接口模板类访问节点信息(C++)
操作系统
心月狐的流火号14 小时前
计算机I/O模式演进与 Java NIO 直接内存
java·操作系统
huisheng_qaq18 小时前
【ElasticSearch实用篇-03】QueryDsl高阶用法以及缓存机制
elasticsearch·缓存·nosql·querydsl·score打分机制
444A4E19 小时前
深入理解Linux进程管理:从创建到替换的完整指南
linux·c语言·操作系统
JulyYu19 小时前
Android系统保存重名文件后引发的异常解决
android·操作系统·源码
卡拉叽里呱啦1 天前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存