操作系统:缓存和内存

缓存是什么?

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

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

相关推荐
敲上瘾26 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
菠萝咕噜肉i3 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
只因在人海中多看了你一眼7 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
Dlwyz8 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
Oak Zhang12 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
门牙咬脆骨13 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨13 小时前
【Redis】GEO数据结构
数据库·redis·缓存
Dlwyz18 小时前
问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
数据库·redis·缓存
不爱学习的YY酱18 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统