大家好,我是呼噜噜,今天我们来介绍计算机的储存器之一,CPU高速缓冲存储器也叫高速缓存,CPU Cache

缓存这个专业术语,在计算机世界中是经常使用到的。它并不是CPU所独有的,比如cdn缓存网站信息,浏览器缓存网页的图像视频等,但本文讲述的是狭义Cache,主要指的是CPU Cache,本文将其简称为"缓存"或者"Cache"

计算机性能的瓶颈

在冯诺依曼架构下,计算机存储器是分层次的,存储器的层次结构如下图所示,是一个金字塔形状的东西。从上到下依次是寄存器、缓存、主存(内存)、硬盘等等

离CPU越近的存储器,访问速度越来越快,容量越来越小,每字节的成本也越来越昂贵

比如一个主频为3.0GHZ的CPU,寄存器的速度最快,可以在1个时钟周期内访问,一个时钟周期(CPU中基本时间单位)大约是0.3纳秒,内存访问大约需要120纳秒,固态硬盘访问大约需要50-150微秒,机械硬盘访问大约需要1-10毫秒,最后网络访问最慢,得几十毫秒左右。

这个大家可能对时间不怎么直观,那如果我们把一个时钟周期如果按1秒算的话,那寄存器访问大约是1s,内存访问大约就是6分钟 ,固态硬盘大约是2-6天 ,传统硬盘大约是1-12个月,网络访问就得几年了!我们可以发现CPU的速度和内存等存储器的速度,完全不是一个量级上的。

电子计算机刚出来的时候,其实CPU是没有缓存Cache的,那个时候的CPU主频很低,甚至没有内存高,CPU都是直接读写内存的

随着时代的发展,技术的革新,从1980年代开始,差距开始迅速扩大,CPU的速度远远超过内存的速度,在冯诺依曼架构下,CPU访问内存的速度也就成了计算机性能的瓶颈!!!

DRAM为内存颗粒,也叫动态随机存取存储器, 图片来源于:How L1 and L2 CPU Caches Work, and Why They're an Essential Part of Modern Chips

为了弥补CPU与内存两者之间的性能差异,也就是要加快CPU访问内存的速度,就引入了缓存CPU Cache,缓存的速度仅次于寄存器,充当了CPU与内存之间的中间角色

缓存及其发展历史

缓存CPU Cache用的是 SRAM(Static Random-Access Memory)的芯片,也叫静态随机存储器。其只要有电,数据就可以保持存在,而一旦断电,数据就会丢失。

CPU Cache 如今通常分为大小不等的3级缓存,分别是 L1 CacheL2 CacheL3 Cache

部件 CPU访问所需时间 备注 大小
L1 高速缓存 2~4 个时钟周期 每个 CPU 核心都有一块属于自己的 L1 高速缓存,L1 高速缓存通常分成指令缓存数据缓存 一般256KB~1MB
L2 高速缓存 10~20 个时钟周期 L2 高速缓存同样是每个 CPU 核心都有的 一般2~8MB
L3 高速缓存 20~60个时钟周期 L3 高速缓存是多个 CPU 核心共用 一般10~64MB

我们可以发现越靠近 CPU 核心的缓存,其访问速度越快,其大小越来越小,其制造成本也越昂贵,常见的Cache典型分布图如下:

回顾Cache发展历史,我们可以发现Cache其实一开始并不是在CPU的内部,我们这里以intel系列为例

在80286之前,那个时候是没有缓存Cache的,那个时候的CPU主频很低,甚至没有内存高,CPU都是直接读写内存的

从80386开始,这个CPU速度和内存速度不匹配问题已经开始展露,并且差距开始迅速扩大,慢速度的内存成为了计算机的瓶颈,无法充分发挥CPU的性能,为解决这个问题,Intel主板支持外部Cache,来配合80386运行

80486将L1 Cache(大小8KB)放到CPU内部,同时支持外接Cache,即L2 Cache(大小从128KB到256KB),但是不分指令和数据Cache

虽然L1 Cache大小只有8KB,但其实对那时候CPU来说够用了,我们来看一副缓存命中率与L1、L2大小的关系图:

图片来源于:How L1 and L2 CPU Caches Work, and Why They're an Essential Part of Modern Chips

从上图我们可以发现,增大L1 cache对于CPU来说好处不太明显,缓存命中率并没有显著提升,成本还会更昂高,所以性价比不高。

而随着 L2 cache 大小的增加,缓存总命中率会急剧上升,因此容量更大、速度较慢、更便宜的L2成为了更好的选择

等到Pentium-1/80586,也就是我们熟悉的奔腾系列,由于Pentium采用了双路执行的超标量结构,有2条并行整数流水线,需要对数据和指令进行双重的访问,为了使得这些访问互不干涉,于是L1 Cache被一分为二,分为指令Cache和数据Cache(大小都是8K),此时的L2 Cache还是在主板上,再后来Intel推出了[Pentium Pro](https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Pentium_Pro)/80686,为了进一步提高性能L2 Cache被正式放到CPU内部

后来CPU多核时代来临,Intel的Pentium D、Pentium EE系列,CPU内部每个核心都有自己的L1、L2 Cache,但他们并不共享,只能依靠总线来传递同步缓存数据。最后Core Duo酷睿系列的出现,L2 Cache变成多核共享模式,采用Intel的“Smart cache”共享缓存技术,到此为止,就确定了现代缓存的基本模式



如今CPU Cache 通常分为大小不等的3级缓存,分别是 L1 Cache、L2 Cache 和 L3 CacheL3 高速缓存为多个 CPU 核心共用的,而L2则被每个核心单独占据,另外现在有的CPU已经有了L4 Cache,未来可能会更多

缓存如何弥补CPU与内存的性能差异?

我们可以思考一个问题:缓存是如何弥补CPU与内存两者之间的性能差异?

缓存主要是利用局部性原理,来提升计算机的整体性能。因为缓存的性能仅次于寄存器,而CPU与内存两者之间的产生的分歧,主要是二者存取速度数量级的差距,那尽可能多地让CPU去存取缓存,同时减少CPU直接访问主存的次数,这样计算机的性能就自然而然地得到巨大的提升

https://chunjianbase.cn

所谓局部性原理,主要分为空间局部性时间局部性

  1. 时间局部性:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
  2. 空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用

缓存这里,会去把CPU最近访问主存(内存)中的指令和数据临时储存着,因为根据局部性原理,这些指令和数据在较短的时间间隔内很可能会被以后多次使用到,其次是当从主存中取回这些数据时,会同时取回与其位置相邻的主存单元的存放的数据 临时储存到缓存中,因为该指令和数据附近的内存区域,在较短的时间间隔内也可能会被多次访问。

那以后CPU去访问这些指令和数据时,首先去命中L1 Cache,如果命中会直接从对应的缓存中取数据,而不必每次去访问主存,如果没命中,会再去L2 Cache中找,依次类推,如果L3 Cache中不存在,就去内存中找。

尾语

本文简单介绍了计算机性能瓶颈的原因,缓存及其发展历史,最后讲解了缓存弥补CPU和内存性能差异的原理,后面我们会继续更详细深入地介绍Cache的组织结构、缓存一致性,以及如何利用缓存提升我们代码的性能等

参考资料:

https://www.extremetech.com/extreme/188776-how-l1-and-l2-cpu-caches-work-and-why-theyre-an-essential-part-of-modern-chips

http://www.cpu-zone.com/80486.htm


作者:小牛呼噜噜,关注公众号「小牛呼噜噜」,更多高质量好文等你!

Linux0.12内核源码解读(5)-head.s

突破计算机性能瓶颈的利器CPU Cache

性能优化!突破性能瓶颈的尖兵CPU Cache的更多相关文章

  1. nginx 性能优化的概述及在CPU资源方面的处理

    nginx的性能优化的概述 软件层面的提升硬件的使用率 增大CPU的利用率 增大内存的利用率 增大磁盘IO利用率 增大网络带宽利用率 提升硬件规格 网卡:万兆网卡.例如10G.25G.40G等 磁盘: ...

  2. 《Android应用性能优化》2——内存、CPU、性能测评

    4.高效使用内存 4.1 说说内存 Android设备的性能主要取决于以下三因素: CPU如何操纵特定的数据类型: 数据和指令需占用多少存储空间: 数据在内存中的布局 4.2 数据类型 int和lon ...

  3. Android 性能优化(20)多核cpu入门:SMP Primer for Android

    SMP Primer for Android 1.In this document Theory Memory consistency models Processor consistency CPU ...

  4. 性能优化-屏幕常亮与CPU唤醒

    Android在不使用的时候,屏幕在一段时间以后会变暗,再过一段时间就会熄屏,此时CPU就会休眠,那么在这个时候,Timer.Handler.Thread.Service等都会暂停,有时候我们需要屏幕 ...

  5. 《Java性能优化权威指南》

    <Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...

  6. VMware虚拟机性能优化

    一.ESX及vCenter服务器的优化 检查ESX物理服务器是否在兼容列表中,特别是BIOS的版本是否符合ESX版本的要求 开启ESX物理服务器硬件虚拟化技术VT-X,AMD-V 关闭BIOS中的英特 ...

  7. 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇

    平均负载 指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数 可运行状态:正在使用CPU或者正在等待CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态 (Run ...

  8. nginx应用总结(2)--突破高并发的性能优化

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

  9. c/c++性能优化--- cache优化的一点杂谈

    之前写了一篇关于c/c++优化的一点建议,被各种拍砖和吐槽,有赞成的有反对的,还有中立的,网友对那篇博客的的评论和吐槽,我一个都没有删掉,包括一些具有攻击性的言论.笔者有幸阅读过IBM某个项目的框架代 ...

  10. 【公开课】【阿里在线技术峰会】何登成:AliSQL性能优化与功能突破的演进之路

    MySQL的公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 本文根据阿里高级数据库专家何登成在首届阿里巴巴在线技术峰会上的分享整理而成.他主要介 ...

随机推荐

  1. 使用 Fluent Bit 实现云边统一可观测性

    本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理. 整理 ...

  2. 如何优雅地将AI人工智能在线客服嵌入企业网站

    随着人工智能(AI)技术的飞速发展,越来越多的企业意识到,将AI客服嵌入企业网站是提升客户体验.提高工作效率的重要手段.相比于传统的人工客服,AI客服可以24/7全天候服务,不仅能有效处理大部分用户问 ...

  3. Java和Python的区别

    Java和Python区别 二者的区别有以下几点:1.Java必须显式声明变量名,而动态类型的Python不需要声明变量.2.Python虚拟机没有Java强,Java虚拟机是Java的核心,Pyth ...

  4. Linux 基础-文本处理命令

    概述 find 文件查找 grep 文本搜索 参考资料 概述 Linux 下使用 Shell 处理文本时最常用的工具有: find.grep.xargs.sort.uniq.tr.cut.paste. ...

  5. centos 的yum源设置

    转载请注明出处: 在CentOS系统中,yum是自带的.yum(Yellowdog Updater, Modified)是一款在CentOS及其他基于Red Hat的Linux发行版中广泛使用的包管理 ...

  6. windows当中C++版本的Opencv安装(动态库+静态库)

    主要参考2篇博客,其实就是dll文件和lib文件的使用方法而已.链接如下: 1.静态库opencv配置 2.动态库opencv安装

  7. Java中序列化与反序列化

    序列化(Serialization)和反序列化(Deserialization)是计算机科学中用于数据存储和传输的两种基本操作. 序列化: 序列化是将对象的状态信息转换为可以存储或传输的形式的过程.简 ...

  8. Edge(Chrome)浏览器插件WordSaver的演示,可以查英语生词并记录生词及所在句子,导出为anki格式

    Edge(Chrome)浏览器插件WordSaver的演示,可以查英语生词并记录生词及所在句子,导出为anki格式 Bilibili哔哩哔哩视频

  9. Mysql篇-语句执行计划详解(explain)

    概述 使用 explain 输出 SELECT 语句执行的详细信息,包括以下信息: 表的加载顺序 sql 的查询类型 可能用到哪些索引,实际上用到哪些索引 读取的行数 Explain 执行计划包含字段 ...

  10. 服务器cli模式下的定时器

    有时候需要一部分后台业务异步的处理,比如处理redis队列啊,处理mysql统计啊,数据同步啊,这种长时间任务,但是又需要每段时间去看看的,发现linux cron最小只能支持每分钟的任务 分 时 天 ...