当前位置:网站首页>缓存
缓存
2022-07-30 12:33:00 【Li-Yongjun】
CPU 速度逐渐甩开内存
一直以来,CPU 总是比内存快,并且差距越拉越大。
原因是,每当有可能在单片芯片上放置更多的电路时,CPU 的设计者总是用它们来事先流水和超标量运算,时 CPU 变得更快。
而内存的设计者却利用这些技术来提高芯片的容量,而不是速度。
这就使两者的速度差距越来越大。
高速缓存
内存速度比 CPU 慢很多,这不是技术问题,事实上,完全可以造出和 CPU 一样快的内存,但是,如果要求全速运行,这种内存只能内置在 CPU 芯片中,因为数据经过总线就太慢了。
在 CPU 中放置大容量内存将使 CPU 变大,价格提高,即使价格不成问题,CPU 芯片的大小也有一个限度。
这样,我们就需要在小容量高速内存和大容量低速内存之间做选择。当然,我们更想要大容量高速内存。
有意思的是,从技术上已经可能将小容量的高速内存和大容量的低速内存组合在一起,以适中的价格得到速度和高速内存差别不大的大容量内存。
小容量高速内存称为高速缓存(cache,来自法语 cacher,意思是隐藏)。
高速缓存的工作原理十分简单:把读取频度最高的内存内容保存在高速缓存中。CPU 需要读入内存内容时,首先在高速缓存中查找。只有在高速缓存中找不到时,才去读内存中的内容。
命中率 Hit Rate
人们认识到,程序并不是完全随机地访问内存。
程序地访存行为具有时间局部性,也就是说上一次访问了该数据,下一次很大程度上还会继续访问。同时还具有空间局部性,也就是如果访问地址 A 上的数据,那么很有可能下一次会访问地址 A±1 上的数据,也就是地址 A 附近地址的数据。
有了这两个前提,缓存的命中率可以保持很高水平。
对于时间局部性,高速缓存的命中率可以保持在很高的级别,比如 95% 以上。
对于空间局部性,缓存控制器可以采用预读的方式,一次性从内存中提取比 CPU 发出的访问请求更多的数据上来,比如 CPU 访问地址 A,缓存控制器可以从内存中提取 A、A+1、A+2 等连续地址的内容,目前主流 CPU 一次从内存提取到缓存的数据大小是 64 字节。
缓存是分级的
从成本和面积考虑,缓存做不大。另外一个考虑则是容量太大的话,当 CPU 访问某个地址的时候,缓存控制器在缓存中搜索该数据是否已经位于缓存时的速度会变慢,所以也不能做的太大。
人们决定使用分级搜索的方式,将缓存分成多个层级:L1 缓存容量最小,电路规模小,运行频率就可以更高,搜索起来最快,然后时 L2、L3 等,以及最后一级缓存(Last Level Cache,LLC),目前主流产品的 LLC 一般就是 L3。这些缓存层级一级比一级容量大,搜索速度逐渐减慢。
缓存是透明的
要充分理解的一点是,缓存是不可以被寻址的。也就是说,CPU 如果有生命的话,它是看不到缓存的存在的,程序员也看不到,即不存在类似这样的代码:“Load 地址A L1缓存”、“Stor L2缓存中的某行数据 地址A”。这就是说,程序员无法细粒度地控制缓存,但是可以粗粒度地操作缓存。比如,实际中存在类似这样地代码:“Flush Cache”(将已经写入缓存但是还没有写入内存的数据写入内存),再比如 “Prefetch 参数”(根据参数将数据预读入缓存)。
边栏推荐
- PyQt5快速开发与实战 8.4 设置窗口背景 && 8.5 不规则窗口的显示
- 基于柔性人机接口的人机协调运动控制方法
- DOM常用方法以及项目
- Smart pointer implementation conjecture
- 【ASP.NET Core】选项类的依赖注入
- Lake storehouse which electricity (2) of the project: project using technology and version and the environment
- IO/multiplexing (select/poll/epoll)
- 浅析TSINGSEE智能视频分析网关的AI识别技术及应用场景
- 监控界的最强王者,没有之一!
- Why is Prometheus a monitoring artifact sufficient to replace Zabbix?
猜你喜欢

漫谈金丝雀部署(Canary Deployment)

即时通讯-改变社交与工作状态的新型软件

Why is Prometheus a monitoring artifact sufficient to replace Zabbix?

Beijing, Shanghai and Guangzhou offline events丨The most unmissable technology gatherings at the end of the year are all gathered

Heshu Group: Make smart cities smarter and make real life better

【语音识别】基于GMM-HMM的语音识别系统

nodeJs--fs模块

13-GuliMall Basics Summary

【微信小程序】一文带你搞懂小程序的页面配置和网络数据请求

PyQt5快速开发与实战 8.4 设置窗口背景 && 8.5 不规则窗口的显示
随机推荐
无人艇轨迹跟踪的预设性能抗扰控制研究
电流电压采集模块DAM-6160
EasyNVS cloud management platform function reconstruction: support for adding users, modifying information, etc.
腰部外骨骼机器人线性自抗扰控制器参数优化
如何将EasyCVR平台RTSP接入的设备数据迁移到EasyNVR中?
unity对象池(学习)
dolphinscheduler添加hana支持
解码Redis最易被忽视的CPU和内存占用高问题
MySQL【排序与分页】
Js - 内置对象
New:WebKitX ActiveX :::Crack
句柄与指针的简单理解
双击Idea图标打不开——解决办法
看了这些6G原型样机,我想一觉睡到2030年
CMake库搜索函数居然不搜索LD_LIBRARY_PATH
PyQt5快速开发与实战 8.2 绘图 && 8.3 QSS的UI美化
崩了,该来的终究躲不掉
Rust from entry to proficient 02-installation
【MySQL系列】-B+树索引和HASH索引有什么区别
Decoding Redis' most overlooked high CPU and memory usage issues