操作系统:缓存和内存

缓存是什么?

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

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

相关推荐
材料苦逼不会梦到计算机白富美8 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
Java 第一深情8 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
HBryce248 小时前
缓存-基础概念
java·缓存
想要打 Acm 的小周同学呀15 小时前
LRU缓存算法
java·算法·缓存
hlsd#15 小时前
go 集成go-redis 缓存操作
redis·缓存·golang
镰刀出海16 小时前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
奶糖趣多多17 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt19 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
ketil271 天前
Redis - String 字符串
数据库·redis·缓存
生命几十年3万天1 天前
redis时间优化
数据库·redis·缓存