操作系统:缓存和内存

缓存是什么?

缓存是现代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的角度都是数据不能厚此薄彼。

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

相关推荐
m0_3807438716 小时前
给大模型调用加一层本地缓存,让重复请求直接命中磁盘
缓存
FakeOccupational18 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
l1t1 天前
DeepSeek总结的在 pg_stat_statements 中诊断高基数工作负载
数据库·缓存·postgresql
2401_894915531 天前
新手落地 Geo 优化:源码下载、依赖安装、数据库初始化完整步骤
运维·服务器·数据库·人工智能·缓存·开源
2401_894915531 天前
Geo 优化源码部署避坑指南:解决访问异常、定位失效、收录卡顿问题
java·服务器·后端·缓存·开源
祈禾2 天前
Redis三大缓存问题与分布式锁
运维·数据库·redis·笔记·分布式·缓存
祈禾2 天前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
孙启超2 天前
【AI应用开发】什么是混合检索(Hybrid Search)?向量检索 + BM25 关键词检索,适用场景与 RRF 融合原理
人工智能·缓存·llm·向量数据库·bm25·向量化·ai应用开发
y = xⁿ2 天前
一文掌握Redis常见八股
数据库·redis·缓存
码云骑士2 天前
101-向量数据库性能调优-100QPS到10000QPS-索引-缓存-分区压测
数据库·python·缓存