说到CPU,不得不说的就是CPU缓存,目前CPU的缓存已经成了衡量CPU性能的一个必要指标,那么CPU缓存到底对CPU性能的影响有多大呢?
我们知道,CPU执行指令时,会将执行结果放在一个叫“寄存器”的元件中,由于“寄存器”集成在CPU内部,与ALU等构成CPU的重要元件,因此寄存器中的指令很快被CPU所访问,但毕竟寄存器的容量太小,CPU所需的大量指令和数据还在内存(RAM)当中,所以CPU为了完成指令操作,需要频繁地向内存发送接收指令、数据。
由于内存的处理速度远远低于CPU,所以传统的系统瓶颈在这里就产生了,CPU在处理指令时往往花费很多时间在等待内存做准备工作。
为了解决这个问题,人们在CPU内部集成了一个比内存快许多的“Cache”,这就是最早的“高速缓存”。
L1高速缓存是与CPU完全同步运行的存储器,也就是我们常说的一级缓存,如果CPU需要的数据和指令已经在高速缓存中了,那么CPU不必等待,直接就可以从一级缓存(L1)中取得数据,如果数据不在L1中,CPU再从二级缓存(L2)中提取数据,大大提高了系统的工作效率。
趣谈CPU缓存工作原理
没有CPU缓存前
我们可以形象地把CPU的运算单元想象成是一间坐落在城市中心的工厂,把内存看成是工厂设置在郊区的一间面积很大的仓库A。

工厂生产所需要的原材料每次都要花时间去远处的仓库A调运,而且到达仓库后,还要等待仓库准备好材料,中间浪费了不少时间。这就是CPU频率未变的情况下,CPU与内存的数据交换不同步的现象。
而突然有一天,由于资金短缺,仓库A从近郊区“搬到”了远郊区,这样原料和成品在工厂与仓库A之间的运输所花费的时间就更长了,工厂生产所需的原料供应不足,经常处于空运转的状态下。这就是说当CPU频率增加后,CPU与内存交换数据等待需时间会变得更长。
增加L1 Cache
要解决CPU与内存交换数据不同步这个系统瓶颈问题,其中一个办法是在靠近工厂的市区设置一个小型的仓库B(L1 Cache)。

平时把生产最迫切需要、用得最多的原材料(指令和数据)从仓库A(内存)调配到仓库B(L1 Cache),这样工厂生产所需要的原材料就可以很快地调配过来,减少空运转的时间。当所需的原材料在仓库B中找不到(缓存未命中)时,仍然要到仓库A(内存)里调配,虽然无可避免地使工厂又进入空运转,或部分空运转(CPU等待若干个时钟周期),但这样毕竟使等待时间大大降低了。
小知识:缓存有一个“预读”功能,也就是可以通过一定的算法,猜测接下来所要的数据,并预先取入缓存。
再添L2 Cache
随着CPU的频率提高,与内存之间交换数据不同步的现象更明显了,可以理解为仓库A(内存)搬离郊区,迁到更远的地方了。解决这一问题的一个更好的办法就是在城市的边缘再设立一个比仓库B大的仓库C,也就是我们说的二级缓存。

它的作用是把郊区之外的仓库A(内存)中最迫切用的材料(指令)运到仓库C,而工厂如果在仓库B中找不到所需的材料,就可以到仓库C中找,而不必老远跑到仓库A那里找,节省了不少时间。
通常情况下,L2包括L1所有的数据,另外还有一些附加的数据。换言之,L1与L2、L2与内存之间是子母关系,所以CPU缓存的出现更有效地解决了CPU空等待所造成的资源浪费问题。
CPU缓存越大越好?
当然,CPU缓存并不是越大越好,因为缓存采用的是速度快、价格昂贵的静态RAM(SRAM),由于每个SRAM内存单元都是由4~6个晶体管构成,增加缓存会带来CPU集成晶体管个数大增,发热量也随之增大,给设计制造带来很大的难度。所以就算缓存容量做得很大,但如果设计不合理会造成缓存的延时,CPU的性能也未必得到提高。

转载于:https://blog.51cto.com/fuming/434526

CPU缓存与CPU性能的关系相关推荐

  1. CPU和CPU寄存器和CPU缓存和CPU内存管理器、RAM、hard disk。以及堆栈、内存映射。

    CPU registers cpu寄存器 包含通用寄存器,状态寄存器 Cache cpu缓存 RAM 内存 hard disk 硬盘 我们常常看到 32位 CPU.64位 CPU 这样的名称,其实指的 ...

  2. CPU缓存越大计算机的性能越好,CPU缓存真的越大越好?小心你的钱包

    除了内存和硬盘,电脑还有一种超快速的存储设备,就是CPU缓存 当你想到你电脑当中的存储设备时,你可能想到的是DDR内存.显卡上的显存.或者更有可能只是机械硬盘和SSD.但其实还有一种超快速的存储设备, ...

  3. 缓存一致性协议和CPU缓存架构(MESI协议)、伪共享

    目录 简介 CPU高速缓存 为什么要有CPU高速缓存 局部性原理 缓存一致性 缓存一致性的要求 总线窥探 工作原理 窥探协议 一致性协议 MESI协议 总线事务 总线仲裁 总线锁定 缓存锁定 伪共享问 ...

  4. 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

    文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...

  5. 控制寄存器,CPU缓存,PWT,PCD

    文章目录 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 CPU缓存 PWT:Page Write Through PCD:Page Cache Disabled 控制寄存器 控制寄存器用于控制 ...

  6. 计算机硬件基础-----CPU缓存

    一.什么是缓存 一台电脑有两种内存 一种是动态随机存储器,它是在RAM( ram是芯片的运行内存)模块中使用的DRAM(Dynamic RAM),使用电容器来存储数据的内存需要动态地被电流刷新才能存储 ...

  7. CPU 缓存如何影响你的 Go 程序性能

    小菜刀最近在medium上阅读了一篇高赞文章<Go and CPU Caches>,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d ...

  8. 浅谈cpu、缓存、内存之间的关系

    一.缓存与内存 许多人认为,"缓存"是内存的一部分  许多技术文章都是这样教授的  但是还是有很多人不知道缓存在什么地方,缓存是做什么用的  其实,缓存是CPU的一部分,它存在于C ...

  9. CPU缓存与性能优化

    CPU缓存与性能优化 如何通过提升CPU缓存的命中率来优化程序的性能? 极客时间 - 陶辉 - CPU缓存:怎样写代码能够让CPU执行得更快? https://time.geekbang.org/co ...

最新文章

  1. android universal image loader 缓冲原理详解
  2. 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
  3. 为什么要做一场WebRTC主题的大会?
  4. Vue 脚手架中的.eslintrc.js代码规范 的解决
  5. P4172-[WC2006]水管局长【LCT,最小生成树】
  6. Python绘制决策树的节点
  7. Too many open files 问题
  8. 提供Gmail与Wallop邀请各两个
  9. hdu4318 最短路变形
  10. android listview固定内容,Android ListView 列表分隔,条目中添加分类信息(文字,图片等)...
  11. 使用Mailgun API简化应用程序中的电子邮件
  12. dedecms 织梦配置 手机 wap 站点,并绑定二级域名
  13. 溢出漏洞,缓冲区溢出漏洞
  14. LTspice基础教程-001.软件简介与安装
  15. ArmHub社区_新手上路
  16. 路由器以太网口静态链路聚合
  17. Linux时间函数time()、ctime()、ctime_r()、localtime()、localtime_r()、asctime()、strftime()的转换关系
  18. Oracle Database SQL Language Reference 笔记(3)—— 伪列(续)
  19. 邮票面值设计java,[蓝桥杯][算法提高VIP]邮票面值设计 (C++代码)
  20. 用了移动路由4G路由2 Pro Wi-Fi也能变成随身专属

热门文章

  1. python线程池模块_Python并发编程之线程池/进程池--concurrent.futures模块
  2. win10便签常驻桌面_win7桌面便签小工具可以作为工作计划软件使用吗?
  3. hdu2167 方格取数 状态压缩dp
  4. hdu1542 线段树扫描线求矩形面积的并
  5. POJ1466 最大点权独立集
  6. 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
  7. 【设计模式】代理模式 ( 静态代理 )
  8. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★
  9. 【DBMS 数据库管理系统】数据仓库 ( 数据仓库简介 | 操作型数据与分析性数据对比 | 数据仓库特征 | 特征一 : 面向主题组织数据 | 面向应用 | )
  10. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试