看了上一篇文章。你可能非常想知道,为什么程序的执行结果会是这样。如今,就让我们来走进 CPU 的世界。

在 SMP(对称多处理器)时代,多个 CPU 一起工作。使运算能力进一步提升,那么CPU 是怎样协调好内存訪问的呢?

     +--------------+                   +--------------+
| CPU0 | | CPU1 |
+--------------+ +--------------+
^ | ^ |
| | | |
| V | V
| +--------+ | +--------+
|<--> | Store | |<--> | Store |
| | Buffer | | | Buffer |
| +--------+ | +--------+
| | | |
| V | V
+--------------+ +--------------+
| Cache | | Cache |
+--------------+ +--------------+
| |
| |
+------------+ +------------+
| Invalidate | | Invalidate |
| Queue | | Queue |
+------------+ +------------+
| Interconnect |
+----------------------------------+
|
+-----------------------+
| Memory |
+-----------------------+

上图是现代 CPU 普遍採用的架构,因为 CPU 的运算能力的增长速度比内存訪问速度快非常多,使得内存的存取成为指令运行过程中相对较慢的过程。所以在 CPU 运算单元和

主存之间还会存在多级的缓存,通常称为 L1, L2, L3。对他们的訪问速度依次递减。上图中仅仅显示了一级缓存的存在。这样,当 CPU 訪问内存时,就会先在自己的 Cache 中查

找。看是否这段内存已经被缓存起来,假设已在缓存中,那么,直接訪问缓存就可以完毕功能。

有了缓存的存在。CPU 的运算速度得到了极大的提高。因为缓存比較昂贵,所以一般都较小,在我的奔腾 E5800 的电脑上。一级缓存一共才 128KBytes.

缓存是由缓存行组成,通常称之为 Cache line,现代 Intel CPU 中。一般都为 64B,通常,缓存都是由多路关联组成。我的 CPU 就是 4-way 关联,这里不想深入解说多路关

联缓存的工作原理,有兴趣的能够自行查阅。

当缓存中没有须要的数据时。叫做 cache miss, 这时通常会从内存中载入,cache 载入都是以 cache line 为单位,而且以 cache line 对齐,也就是在 cache line 对齐的

地址上载入 cache line 大小的内容进入缓存,这里一般为 64 个字节,就也就是把经常使用数据放在一个 cache line 对齐的内存中,这种数据结构会使得运算效率提高的原因。

    当多个 CPU 都须要訪问同样内存时。那么同一段内存的内容将会出如今多个 CPU 的cache 之中,这带来的一个问题就是,怎样维护好它们之间的统一性就成了问题。比方,当同一块地址被两个 cache 同一时候缓存的时候,当中一个要改写,那么必须要存在一种手段去通知另外的 cache 即时更新。以免还有一个 CPU 须要取数据时能得到最新的数据。

    缓存既然带来了这些问题。那么可不能够指令某些内存被訪问时要不要被缓存呢。或者更准确地讲。当訪问一块内存时怎样控制缓存的形为呢?答案是能够的。我们能够指定内存的类型。

通过 MTRRs 寄存器能够指定物理地址范围的内存类型,一般内存有这些经常使用类型:

    1. UC (Uncacheable), 表示这段内存不能被缓存。

    2. WT (Write Through), 表示写入时,cache 和内存都是更新。

    3. WB (Write Back), 表示仅仅更新 cache, 合适时机再写回到内存中。

4. WC (Write combining) 这样的内存不会被 cache, 对于写操作可能会被延迟写入。

可是往往,为了取得比較高的效率。普通内存的使用通常会选择 WB 类型。也就是内存会被 cache 。此时就须要一种手段来保证各个 cache 之间的一致性了,专业一点来讲就是 Cache-coherence 。

    那么怎样知道自己 cache 中的 cache line 在其他 CPU 的 cache 中存在呢。怎样记录自己的 cache line 被自己改动过,须要回写呢,显然要有一些状态标记来记录这些

东西。这就是 MESI 协议。

    在MESI协议中。每一个Cache line有4个状态。可用2个bit表示,它们各自是: 

    1. M(Modified)

    这行数据有效,数据被改动了。和内存中的数据不一致,数据仅仅存在于本Cache中。

2. E(Exclusive)

    这行数据有效,数据和内存中的数据一致,数据仅仅存在于本Cache中。

    3. S(Shared)

    这行数据有效,数据和内存中的数据一致,数据可能存在于非常多Cache中。

4. I(Invalid)

    这行数据无效。

    真相正在一步一步解开...

走进 CPU 的 Cache的更多相关文章

  1. verilog简易实现CPU的Cache设计

    verilog简易实现CPU的Cache设计 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4661147.html所增加的Cache,相同的内容就不重复写了 ...

  2. linux查看CPU高速缓存(cache)信息

    一.Linux下查看CPU Cache级数,每级大小 dmesg | grep cache 实例结果如下: 二.查看Cache的关联方式 在 /sys/devices/system/cpu/中查看相应 ...

  3. 天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍

    前言 大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬 ...

  4. ROM、RAM、CPU、CACHE、FLASH的区别

    内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE).只不过因为RAM是其中最重要的存储器,所以通常所说的内存即指电脑系统中的RAM. RAM要求每时 ...

  5. ROM、RAM、CPU、CACHE、FLASH

    内存在电脑中起着举足轻重的作用.内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE).只不过因为RAM是其中最重要的存储器,所以通常所说的内存即指电脑 ...

  6. 从Java视角理解CPU缓存(CPU Cache)

    从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...

  7. cpu性能探究 :cache line 原理

     參考: 一个解说Direct Mapped Cache很深入浅出的文章: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/dir ...

  8. [转帖]CPU Cache 机制以及 Cache miss

    CPU Cache 机制以及 Cache miss https://www.cnblogs.com/jokerjason/p/10711022.html CPU体系结构之cache小结 1.What ...

  9. CPU Cache 机制以及 Cache miss

    CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...

随机推荐

  1. STM32 SPI 发送第一个数据不成功问题

    STM32的标准库,跟HAL库都是很实用的, 在使用SPI库的过程中一定要注意时序的问题. 我在调试SPI过程中,调试了两个IC,都是用HAL库, 第一个IC没出问题,第二个IC出现了第一次发送数据不 ...

  2. 楼宇自控-RS232\RS485\RS422

    1.rs-232-c rs-232-c是美国电子工业协会eia(electronic industry association)制定的一种串行物理接口标准.rs是英文"推荐标准"的 ...

  3. ASP.NET-post、get的区别

    post.get的区别 1.get通过把参数加在浏览器的地址栏中提交(最大2K),用post可以进行文件的提交: 2.使用post提交的页面在点击[刷新]按钮的时候浏览器一般会提示"是否重新 ...

  4. POJ——T 3159 Candies

    http://poj.org/problem?id=3159 Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 33328   ...

  5. 日志工具全面理解及配置应用---以Log4j例子

    一.日志系统基本常识 1.日志系统作用:将日志信息输出到控制台和文本文件,以追踪代码运行信息. 2.日志系统操作的是什么?日志系统打印信息,也是调用日志系统的log.Info(),log.Warn() ...

  6. 10.2.0.4 to 10.2.0.5 Installation of Patch Set Release (Windows)

    环境:10.2.0.4集群数据库zlm10g(双节点,zlm10g1,zlm10g2) 系统:Windows 2003 Server 64Bit 内存:2G RAM 存储:ASM 目标:把集群数据库从 ...

  7. 玩转oracle学习第六天

     1.上节回想 2.PL/SQL的介绍 3.PL/SQL的基础 理解oracle的pl/sql概念 掌握PL/SQL编程技术(包含编写过程,函数,触发器.包... ) PL/SQL是什么? PL/ ...

  8. OC的动态继承编译机制

    [问]为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却能够. [再问]为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却能够. [答]由于OC的动态继承编 ...

  9. nyoj--61--传纸条(一)(动态规划)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  10. angular4(3)angular脚手架引入scss

    scss..sass....sccc...ssss...ccccc......MMP················· 先说下scss和sass的异同: SCSS 是 Sass 3 引入新的语法,其语 ...