操作系统:缓存和内存

缓存是什么?

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

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

相关推荐
Hello.Reader1 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
麦香--老农2 小时前
windows 钉钉缓存路径不能修改 默认C盘解决方案
缓存·钉钉
C++忠实粉丝3 小时前
Redis 介绍和安装
数据库·redis·缓存
丰云3 小时前
一个简单封装的的nodejs缓存对象
缓存·node.js
Oneforlove_twoforjob3 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
泰伦闲鱼3 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
ClouGence3 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存
IT 青年4 小时前
操作系统(23)外存的存储空间的管理
操作系统
你好helloworld6 小时前
《操作系统真象还原》第八章(一) —— 位图及其实现
操作系统
弗罗里达老大爷6 小时前
Redis
数据库·redis·缓存