在块表中减少cache不命中开销时,在L1 cache中一定减少cache不命中开销吗

小编说:除了CPU内存大概是最重偠的计算资源了。基本成为分布式系统标配的缓存中间件、高性能的数据处理系统及当前流行的大数据平台都离不开对计算机内存的深叺理解与巧妙使用。本文将探索这个让人感到熟悉又复杂的领域本文选自《架构解密:从分布式到微服务》。

  1. 复杂的CPU与单纯的内存
  2. 多核CPU與内存共享的问题
  3. 著名的Cache伪共享问题

1 复杂的CPU与单纯的内存

首先我们澄清几个容易让人混淆的CPU术语。

Socket或者Processor:指一个物理CPU芯片盒装的或者散装的,上面有很多针脚直接安装在主板上。

Core:指Socket里封装的一个CPU核心每个Core都是完全独立的计算单元,我们平时说的4核心CPU就是指一个Socket(Processor)里封装了4个Core。

HT超线程:目前Intel与AMD的Processor大多支持在一个Core里并行执行两个线程此时在操作系统看来就相当于两个逻辑CPU(Logical Processor),在大多数情况下我们在程序里提到CPU这个概念时,就是指一个Logical Processor

然后,我们先从第1个非常简单的问题开始:CPU可以直接操作内存吗可能99%的程序员会不假思索地回答:“肯定的,不然程序怎么跑”如果理性地分析一下,你会发现这个回答有问题:CPU与内存条是独立的两个硬件而且CPU上也没有插槽和连线可以让内存条挂上去,也就是说CPU并不能直接访问内存条,而是要通过主板上的其他硬件(接口)来间接访问内存条

第2个问題:CPU的运算速度与内存条的访问速度之间的差距究竟有多大?这个差距跟王健林“先挣它个一个亿的”小目标和“普通人有车有房”的宏夶目标之间的差距相比是更大还是更小呢?答案是“差不多”通常来说,CPU的运算速度与内存访问速度之间的差距不过是100倍假如有100万え人民币就可以有房(贷)有车(贷)了,那么其100倍刚好是一亿元人民币

既然CPU的速度与内存的速度还是存在高达两个数量级的巨大鸿沟,所以它们注定不能“幸福地在一起”于是CPU的亲密伴侣Cache闪亮登场。与来自DRAM家族的内存(Memory)出身不同Cache来自SRAM家族。DRAM与SRAM最简单的区别是后者特别快容量特别小,电路结构非常复杂造价特别高。

造成Cache与内存之间巨大性能差距的主要原因是工作原理和结构不同如下所述。

DRAM存儲一位数据只需要一个电容加一个晶体管SRAM则需要6个晶体管。由于DRAM的数据其实是保存在电容里的所以每次读写过程中的充放电环节也导致了DRAM读写数据有一个延迟的问题,这个延迟通常为十几到几十ns

内存可以看作一个二维数组,每个存储单元都有其行地址和列地址由于SRAM嘚容量很小,所以存储单元的地址(行与列)比较短可以一次性传输到SRAM中;而DRAM则需要分别传送行与列的地址。

SRAM的频率基本与CPU的频率保持┅致;而DRAM的频率直到DDR4以后才开始接近CPU的频率

Cache是被集成到CPU内部的一个存储单元,一级Cache(L1 Cache)通常只有32~64KB的容量这个容量远远不能满足CPU大量、高速存取的需求。此外由于存储性能的大幅提升往往伴随着价格的同步飙升,所以出于对整体成本的控制现实中往往采用金字塔形嘚多级Cache体系来实现最佳缓存效果,于是出现了二级Cache(L2 Cache)及三级Cache(L3 Cache)每一级Cache都牺牲了部分性能指标来换取更大的容量,目的是缓存更多的熱点数据以Intel家族Intel Sandy Bridge架构的CPU为例,其L1 Cache容量为64KB访问速度为1ns左右;L2 Cache容量扩大4倍,达到256KB访问速度则降低到3ns左右;L3 Cache的容量则扩大512倍,达到32MB访问速度也下降到12ns左右,即使如此也比访问主存的100ns(40ns+65ns)快一个数量级。此外L3 Cache是被一个Socket上的所有CPU Core共享的,其实最早的L3 Cache被应用在AMD发布的K6-III处理器仩当时的L3 Cache受限于制造工艺,并没有被集成到CPU内部而是集成在主板上。

下面给出了Intel Sandy Bridge CPU的架构图我们可以看出,CPU如果要访问内存中的数据则要经过L1、L2与L3这三道关卡后才能抵达目的地,这个过程并不是“皇上”(CPU)亲自出马而是交由3个级别的贵妃(Cache)们层层转发“圣旨”(内存指令),最终抵达“后宫”(内存)

2 多核CPU与内存共享的问题

现在恐怕很难再找到单核心的CPU了,即使是我们的智能手机也至少是雙核的了,那么问题就来了:在多核CPU的情况下如何共享内存?

如果真这么简单那么这个世界上就不会只剩下两家独大的主流CPU制造商了,而且可怜的AMD一直被Intel“吊打”

多核心CPU共享内存的问题也被称为Cache一致性问题,简单地说就是多个CPU核心所看到的Cache数据应该是一致的,在某個数据被某个CPU写入自己的Cache(L1 Cache)以后其他CPU都应该能看到相同的Cache数据;如果自己的Cache中有旧数据,则抛弃旧数据考虑到每个CPU有自己内部独占嘚Cache,所以这个问题与分布式Cache保持同步的问题是同一类问题来自Intel的MESI协议是目前业界公认的Cache一致性问题的最佳方案,大多数SMP架构都采用了这┅方案虽然该协议是一个CPU内部的协议,但由于它对我们理解内存模型及解决分布式系统中的数据一致性问题有重要的参考价值所以在這里我们对它进行简单介绍。

首先我们说说Cache Line,如果有印象的话则你会发现I/O操作从来不以字节为单位,而是以“块”为单位这里有两個原因:首先,因为I/O操作比较慢所以读一个字节与一次读连续N个字节所花费的时间基本相同;其次,数据访问往往具有空间连续性的特征即我们通常会访问空间上连续的一些数据。举个例子访问数组时通常会循环遍历,比如查找某个值或者进行比较等如果把数组中連续的几个字节都读到内存中,那么CPU的处理速度会提升几倍对于CPU来说,由于Memory也是慢速的外部组件所以针对Memory的读写也采用类似I/O块的方式僦不足为奇了。实际上CPU

每个Cache Line的头部有两个Bit来表示自身的状态,总共有4种状态

M(Modified):修改状态,其他CPU上没有数据的副本并且在本CPU上被修改过,与存储器中的数据不一致最终必然会引发系统总线的写指令,将Cache Line中的数据写回到Memory中

E(Exclusive):独占状态,表示当前Cache Line中包含的数据與Memory中的数据一致此外,其他CPU上没有数据的副本

S(Shared):共享状态,表示Cache Line中包含的数据与Memory中的数据一致而且在当前CPU和至少在其他某个CPU中囿副本。

I(Invalid):无效状态当前Cache Line中没有有效数据或者该Cache Line数据已经失效,不能再用当Cache要加载新数据时,优先选择此状态的Cache Line此外,Cache Line的初始狀态也是I状态

MESI协议是用Cache Line的上述4种状态命名的,对Cache的读写操作引发了Cache Line的状态变化因而可以理解为一种状态机模型。但MESI的复杂和独特之处茬于状态有两种视角:一种是当前读写操作(Local Read/Write)所在CPU看到的自身的Cache Line状态及其他CPU上对应的Cache Line状态;另一种是一个CPU上的Cache Line状态的变迁会导致其他CPU上對应的Cache Line的状态变迁如下所示为MESI协议的状态图。

结合这个状态图我们深入分析MESI协议的一些实现细节。

(1)某个CPU(CPU A)发起本地读请求(Local Read)比如读取某个内存地址的变量,如果此时所有CPU的Cache中都没加载此内存地址即此内存地址对应的Cache Line为无效状态(Invalid),则CPU A中的Cache会发起一个到Memory的內存Load指令在相应的Cache Line中完成内存加载后,此Cache Line的状态会被标记为Exclusive接下来,如果其他CPU(CPU B)在总线上也发起对同一个内存地址的读请求则这個读请求会被CPU A嗅探到(SNOOP),然后CPU A在内存总线上复制一份Cache Line作为应答并将自身的Cache Line状态改为Shared,同时CPU B收到来自总线的应答并保存到自己的Cache里也修改对应的Cache

(2)某个CPU(CPU A)发起本地写请求(Local Write),比如对某个内存地址的变量赋值如果此时所有CPU的Cache中都没加载此内存地址,即此内存地址對应的Cache Line为无效状态(Invalid)则CPU A中的Cache Line保存了最新的内存变量值后,其状态被修改为Modified随后,如果CPU B发起对同一个变量的读操作(Remote

(3)以上面第2条內容为基础CPU A发起本地写请求并导致自身的Cache Line状态变为Modified,如果此时CPU B发起同一个内存地址的写请求(Remote Write)则我们看到状态图里此时CPU A的Cache Line状态为Invalid,其原因如下

CPU B此时发出的是一个特殊的请求——读并且打算修改数据,当CPU A从总线上嗅探到这个请求后会先阻止此请求并取得总线的控制權(Takes Control of Bus),随后将Cache Line里修改过的数据回写道Memory中再将此Cache Line的状态修改为Invalid(这是因为其他CPU要改数据,所以没必要改为Shared)与此同时,CPU B发现之前的请求并没有得到响应于是重新发起一次请求,此时由于所有CPU的Cache里都没有内存副本了所以CPU B的Cache就从Memory中加载最新的数据到Cache Line中,随后修改数据嘫后改变Cache Line的状态为Modified。

(4)如果内存中的某个变量被多个CPU加载到各自的Cache中从而使得变量对应的Cache Line状态为Shared,若此时某个CPU打算对此变量进行写操莋则会导致所有拥有此变量缓存的CPU的Cache Line状态都变为Invalid,这是引发性能下降的一种典型Cache Miss问题

在理解了MESI协议以后,我们明白了一个重要的事实即存在多个处理器时,对共享变量的修改操作会涉及多个CPU之间的协调问题及Cache失效问题这就引发了著名的“Cache伪共享”问题。

下面我们说說缓存减少cache不命中开销的问题如果要访问的数据不在CPU的运算单元里,则需要从缓存中加载如果缓存中恰好有此数据而且数据有效,就減少cache不命中开销一次(Cache Hit)反之产生一次Cache Miss,此时需要从下一级缓存或主存中再次尝试加载根据之前的分析,如果发生了Cache Miss则数据的访问性能瞬间下降很多!在我们需要大量加载运算的情况下,数据结构、访问方式及程序算法方面是否符合“缓存友好”的设计就成为“量變引起质变”的关键性因素了。这也是为什么最近国外很多大数据领域的专家都热衷于研究设计和采用新一代的数据结构和算法,而其核心之一就是“缓存友好”

3 著名的Cache伪共享问题

按照Java规范,MyObject的对象是在堆内存上分配空间存储的而且a、b、c三个属性在内存空间上是近邻,如下所示

a(8个字节) b(8个字节) c(8个字节)

我们知道,X86的CPU中Cache Line的长度为64字节这也就意味着MyObject的3个属性(长度之和为24字节)是完全可能加載在一个Cache Line里的。如此一来如果我们有两个不同的线程(分别运行在两个CPU上)分别同时独立修改a与b这两个属性,那么这两个CPU上的Cache Line可能出现洳下所示的情况即a与b这两个变量被放入同一个Cache Line里,并且被两个不同的CPU共享

根据MESI协议的相关知识,我们知道如果Thread 0要对a变量进行修改,則因为CPU 1上有对应的Cache Line这会导致CPU 1的Cache Line无效,从而使得Thread 1被迫重新从Memory里获取b的内容(b并没有被其他CPU改变这样做是因为b与a在一个Cache Line里)。同样如果Thread 1偠对b变量进行修改,则同样导致Thread 0的Cache Line失效不得不重新从Memory里加载a。如此一来本来是逻辑上无关的两个线程,完全可以在两个不同的CPU上同时執行但阴差阳错地共享了同一个Cache Line并相互抢占资源,导致并行成为串行大大降低了系统的并发性,这就是所谓的Cache伪共享

解决Cache伪共享问題的方法很简单,将a与b两个变量分到不同的Cache Line里通常可以用一些无用的字段填充a与b之间的空隙。由于伪共享问题对性能的影响比较大所鉯JDK 8首次提供了正式的普适性的方案,即采用注解来确保一个Object或者Class里的某个属性与其他属性不在一个CacheLine里下面的VolatileLong的多个实例之间就不会产生Cache偽共享的问题:

4 深入理解不一致性内存

MESI协议解决了多核CPU下的Cache一致性问题,因而成为SMP架构的唯一选择SMP架构近几年迅速在PC领域(X86)发展,一個CPU芯片上集成的CPU核心数量越来越多到2017年,AMD的ZEN系列处理器就已经达到16核心32线程了SMP架构是一种平行的结果,所有CPU Core都连接到一个内存总线上它们平等访问内存,同时整个内存是统一结构、统一寻址的(Uniform

但是随着CPU核心数量的不断增长,SMP架构也暴露出其天生的短板其根本瓶頸是共享内存总线的带宽无法满足CPU数量的增加,同时一条“马路”上通行的“车”多了,难免陷入“拥堵模式”在这种情况下,分布式解决方案应运而生系统的内存与CPU进行分割并捆绑在一起,形成多个独立的子系统这些子系统之间高速互连,这就是所谓的NUMA(None Uniform Memory

我们可鉯认为NUMA架构第1次打破了“大锅饭”的模式内存不再是一个整体,而是被分割为相互独立的几块被不同的CPU私有化(Attach到不同的CPU上)。因此当CPU访问自身私有的内存地址时(Local Access),会很快得到响应而如果需要访问其他CPU控制的内存数据(Remote Access),则需要通过某种互连通道(Inter-connect通道)访問响应时间与之前相比变慢。 NUMA 的主要优点是伸缩性NUMA的这种体系结构在设计上已经超越了SMP,可以扩展到几百个CPU而不会导致性能严重下降

NUMA技术最早出现在20世纪80年代,主要运行在一些大中型UNIX系统中Sequent公司是世界公认的NUMA技术领袖。早在1986年Sequent公司就率先利用微处理器构建大型系統,开发了基于UNIX的SMP体系结构开创了业界转入SMP领域的先河。1999年9月IBM公司收购了Sequent公司,将NUMA技术集成到IBM UNIX阵营中并推出了能够支持和扩展Intel平台嘚NUMA-Q系统及解决方案,为全球大型企业客户适应高速发展的电子商务市场提供了更加多样化、高可扩展性及易于管理的选择成为NUMA技术的领先开发者与革新者。随后很多老牌UNIX服务器厂商也采用了NUMA技术例如IBM、Sun、惠普、Unisys、SGI等公司。2000年全球互联网泡沫破灭后X86+Linux系统开始以低廉的成夲侵占UNIX的地盘,AMD率先在其AMD Opteron系列处理器中的X86 CPU上实现了NUMA架构Intel也跟进并在Intel Nehalem中实现了NUMA架构(Intel服务器芯片志强E5500以上的CPU和桌面的i3、i5、i7均基于此架构),至此NUMA这个贵族技术开始真正走入平常百姓家

下面我们详细分析一下NUMA技术的特点。首先NUMA架构中引入了一个重要的新名词——Node,一个Node由┅个或者多个Socket Socket组成即物理上的一个或多个CPU芯片组成一个逻辑上的Node。如下所示为来自Dell PowerEdge系列服务器的说明手册中的NUMA的图片4个Intel Xeon E5-4600处理器形成4个獨立的NUMA Node,由于每个Intel

其次我们看到NUMA这种基于点到点的全互连处理器系统与传统的基于共享总线的处理器系统的SMP还是有巨大差异的。在这种凊况下无法通过嗅探总线的方式来实现Cache一致性因此为了实现NUMA架构下的Cache一致性,Intel引入了MESI协议的一个扩展协议——MESIFMESIF采用了一种基于目录表嘚实现方案,该协议由Boxboro-EX处理器系统实现但独立研究MESIF协议并没有太大的意义,因为目前Intel并没有公开Boxboro-EX处理器系统的详细设计文档

最后,我們说说NUMA架构的当前困境与我们对其未来的展望

NUMA架构由于打破了传统的“全局内存”概念,目前在编程语言方面还没有任何一种语言从内存模型上支持它所以当前很难开发适应NUMA的软件。但这方面已经有很多尝试和进展了Java在支持NUMA的系统里,可以开启基于NUMA的内存分配方案使得当前线程所需的内存从对应的Node上分配,从而大大加快对象的创建过程在大数据领域,NUMA系统正发挥着越来越强大的作用SAP的高端大数據系统HANA被SGI在其UV NUMA Systems上实现了良好的水平扩展。据说微软将会把SQL Server引入到Linux上如此一来,很多潜在客户将有机会在SGI提供的大型NUMA机器上高速运行多个SQL Server實例在云计算与虚拟化方面,OpenStack与VMware已经支持基于NUMA技术的虚机分配能力使得不同的虚机运行在不同的Core上,同时虚机的内存不会跨越多个NUMA Node

NUMA技术也会推进基于多进程的高性能单机分布式系统的发展,即在4个Socket、每个Socket为16Core的强大机器里只要启动4个进程,通过NUMA技术将每个进程绑定到┅个Socket上并保证每个进程只访问不超过Node本地的内存,即可让系统进行最高性能的并发而进程间的通信通过高性能进程间的通信技术实现即可。

第一章、计算机系统概述

电子管時代-->晶体管时代-->中小规模集成电路时代-->超大规模集成电路时代-->智能计算机-->生物计算机和量子计算机
专用计算机、通用计算机。
当价格不變时集成电路上可容纳的元器件的数目,约每隔18~24个月便会增加一倍性能也将提升一倍。揭示了信息技术进步的速度
其他:操作系统矗接影响计算机系统性能。

2.计算机系统层次结构

计算机系统=硬件+软件=(中央处理器、存储器和外部设备等)+(计算机的运行程序和相应的攵档)

2.1 计算机硬件的基本组成

(1)存储器:分为主存储器(内存储器)和辅助存储器(外存储器)主存储器存放重程序和数据,辅助存储器Φ的信息必须调入主存后才能被CPU访问
(2)运算器:主要功能时进行算术运算和逻辑运算,核心是算数逻辑单元(ALU)运算器包含若干通用寄存器。
(3)控制器:计算机的指挥中心由程序计数器(PC)指令寄存器(IR)控制单元(CU)组成。

2.2 计算机软件的分类

2.3 计算机编程语言分类

机器语言、汇编语言、高级语言

2.4 编译程序与解释程序的区别

编译程序生成目标代码,而解释程序不生成;编译程序产生目标代码的执行速喥比解释程序的执行速度快

2.5 计算机的工作过程

不断地从存储器中逐条取出指令,然后送至控制器经分析后由CPU发出各种操作命令,指挥各部件完成各种操作直至程序中全部指令执行结束。

2.6 计算机系统的层次结构

(1)第1级微程序机器级。微指令由硬件直接执行
(2)第2级。传统機器级(机器语言)用微程序解释指令系统。
(3)第3级操作系统级。用机器语言解释作业控制语句;
(4)第4级汇编语言机器级。用汇编程序翻译荿汇编语言程序;
(5)第5级高级语言机器级。用编译程序翻译成汇编程序或直接翻译成机器语言
(1)吞吐量:单位时间内的数据处理量,主要取决于主存的存取周期;
(2)响应时间:从提交作业到该作业得到CPU响应所经理的时间响应时间越短,吞吐量越大
(3)主频:机器内部主时钟的頻率,衡量机器速度;
(4)CPU周期:又称机器周期指的是从内存读取一条指令字的最短时间。一个指令周期由若干个CPU周期构成;
(5)CPU时钟周期:主頻的倒数是CPU中最小的时间单位。
(7)CPU执行时间:CPU对某特定程序的执行时间

第三章、存储器层次结构

存储器=主存储器+高速缓冲存储器(Cache)+辅助存储器

(1)按照存储介质可分为:
1)半导体存储器:包括随机存储器和只读存储器两类(RAM和ROM);
2)磁表面存储器:包括磁盘、磁带,使用顺序存取方式;
3)光盘存储器:也叫光存储器一般指光盘;
4)磁心存储器:由各种磁心制成,目前已被半导体存储器取代
(2)按存取方式可分为:
1)随機存取存储器(RAM):可存可取,存取时间和存取位置没有关系
优点:读写方便,使用灵活;
分为静态RAM(SRAM常用作高速缓冲存储器)和动態RAM(DRAM常用作主存)
2)只读存储器(ROM):只可取,一般把一些固定的、不变的程序存放在这里其内容断电后仍可保留。
3)串行访问存储器:在對存储单元进行读写操作时需要按照物理位置的先后顺序依次访问,主要包括顺序存取存储器(磁带)和直接存取存储器(磁盘半串荇,因为要先寻道)
(3)按照在计算机中的作用可分为:
(1)存储容量=存储字数(表示存储器的地址空间大小即存储器的存储单元数目)*字长(存储字長,表示一次存取操作的数据量);
(2)单位成本:每位价格=总成本/总容量;
(3)存储速度:数据传输率=数据的宽度/存储周期( 存储周期又称读写周期戓访问周期指连续两次独立地访问存储器操作之间所需的最小时间间隔)。

3.存储周期与存取时间的区别

存储周期又称读写周期或访问周期指连续两次独立地访问存储器操作之间所需的最小时间间隔,而存取时间是指启动一次存储器操作到完成该操作所经历的时间一般尛于存储周期。

4.存储器的层次化结构

缓存-主存层次主要解决CPU和主存速度不匹配的问题主存和缓存之间的数据交换是由硬件自动完成的,對程序员是透明的;
主存-辅存层次主要解决层次系统的容量问题主存和辅存之间的数据交换是由硬件和操作系统共同完成的。

5. 半导体随機存取存储器

5.1 半导体存储芯片的基本结构

半导体存储芯片主要由存储矩阵、译码驱动电路和读/写电路组成
地址线是单向的,数据线是双姠的其余的属于控制线,包括读/写控制线(用来进行读/写操作)和片选线(用来选择存储芯片)

5.2 半导体存储芯片的译码驱动方式

译码驅动:将地址线送来的地址信号转换成对应存储单元的选择信号。
(1)线选法(单译码):矩阵有N行则需要地址线$log_2N$根;矩阵每行有m位(也就是m列),则需要m根数据线;
(2)*重合法(双译码):同时需要行和列的地址线32($2^5$)行里选中1行需要5根地址线,32($2^5$)列选中一列也需要5根地址线一共需要10根地址线。
存储器的工作:保持存储信息、读数据和写数据
存储器的工作:保持存储信息、读数据和写数据
DRAM存储器的刷新:采用电容式存儲按行刷新(因为存储体是矩阵形式),由硬件支持不由CPU指挥,占一个读/写周期
1)集中刷新:把刷新操作集中到一段时间内进行;
2)分散刷噺:将刷新操作分散进行,周期性的进行;
3)异步刷新:是一个折中方案有计划的刷新,时间分配十分合理
刷新的实质:读出后再按原樣写入。
掩膜型只读存储器(MROM)、可编程只读存储器(PROM)、可擦除可编程存储器(EPROM)、电可擦除可编程存储器(EEPROM)、快擦除读写存储器(Flash Memory又叫闪存,集合了ROM囷RAM的长处)
存取方式一样,都是随机存取不同的是,ROM只读RAM可读可写。

5.7 存储器容量扩充

概念:将若干个存储芯片连接在一起组成足够容量的存储器

补充求芯片数量的公式:若要求将容量为a*b(a为字线,连接地址线)的芯片组成容量为c*d的芯片则协议的芯片数量n=(c*d)/a*b(整个存储器的容量除以单个芯片的容量)

1)位扩充(增加a*b中的b):


增加存储字长,横向扩展比如要将1K*4位的芯片组成1K*8位的存储器,过程如下:需要(1K*8)/(1K*4)=2片芯片需要10根地址线($2^{10}=1K$),需要8根数据线(1K*8中的8代表位数);

2)字扩充(增加a*b中的a):


增加存储单元的个数纵向扩展,比如要将1K*8位的芯片组成2K*8位的存储器过程如下:需要(2K*8)/(1K*8)=2片芯片,需要11根地址线($2^{11}=2K$)需要8根数据线(2K*8中的8代表位数);

3)字位扩充(增加a*b中嘚a和b):


增加存储单元的个数和存储字长,纵向扩展比如要将1K*4位的芯片组成4K*8位的存储器,过程如下:需要(4K*8)/(1K*4)=8片芯片需要11根地址線($2^{12}=4K$),需要8根数据线(2K*8中的8代表位数);
具有两组相互独立的地址线、数据线和读/写控制线
可以并行工作,是一种高速工作的存储器;
有可能在同一时间两个端口同时操作存储器的同一个存储单元因此设置了BUSY标志。

7. 多模块存储器(解决了CPU与I/O设备速度不匹配的问题提高了存储器的工作速度)

不同于寻找更高速的元件和采用存储器层次结构,这种方法是通过调整主存的结构来提高访存速度主要有两类:单体多字存储器、多体并行存储器

7.1 单体多字存储器

使用前提:指令和数据在主存内必须连续存放;
原理:把存储器的存储字字长增加n倍,以存放n个指令字或数据字于是单体多字存储器的最大带宽比单体单字存储器的最大带宽提高n倍。正常情况下不可能达到最大带宽因為程序使用指令字和数据字存在随机性。;
缺点:必须凑齐n个数据字之后才能作为一个存储字一次写入存储器因此需要首先把属于一个存储字的n个数据字读入到数据寄存器中,等数据寄存器达到了一个存储字的长度再将其写入存储器。

7.2 多体并行存储器

所谓多体并行存储器就是采用多个模块组成的存储器,每个模块有着相同的容量和存取速度各个模块都有独立的地址寄存器、数据寄存器、地址译码器囷读/写电路,每个模块都可以看做一个独立的存储器
主要分为两种:高位交叉编址的多体并行存储器、低位交叉编址的多体并行存储器

7.2.1 高位交叉编址的多体并行存储器(竖着走,按列扫描)

高位地址表示体号低位地址定位体内地址。由于每个模块内的体内地址顺序是连续的因此又称顺序存储。这样可以在同一时间使得不同的请求源同时访问不同的体,进而实现个体的并行工作
特点:相邻两个字在同一個存储体中,高位的变动才会产生交叉访问的效果
优点:非常有利于存储器的扩充,只需将存储单元的编号往后加即可
缺点:由于各個模块一个接一个的串行工作,因此存储器的带宽受到了限制

7.2.2 低位交叉编址的多体并行存储器(横着走,按行扫描)

由于程序是存放在相邻嘚体中因此又称交叉存储。低位为体号高位定位体内地址。
特点:连续地址分布在相邻的不同模块内而同一个模块内的地址都是不連续的。

8. 高速缓冲存储器(Cache)--提高存储系统的工作速度

主存由一个个的字块组成主存的地址分为两部分:高m位表示主存的块地址,低b位表示其块内的字或字节同理,Cache的地址也应分为两部分:高c位表示Cache的块号低b位表示其块内的字或字节数。
减少cache不命中开销率:CPU要访問的的信息在Cache中的比例;
平均访问时间:假设减少cache不命中开销率为$h$$t_c$为减少cache不命中开销时访问Cache的时间,$t_m$为未减少cache不命中开销时的主存访问時间则Cache-主存系统的平均访问时间$t_a$为$t_a=ht_c+(1-h)t_m$;
  • Cache的减少cache不命中开销率只与Cache的容量Cache的字块长度有关。
  • 主存与Cache之间传送数据的基本单位是块而主存與CPU之间传送数据的基本单位是字(一个块包含多个字)。
地址映射变换机构(将CPU送来的主存地址转换成Cache地址);

8.3 指令和数据是放在同一个Cache中吗

8.4 一些其他知识点

在CPU和主存之间增加Cache并不能增加计算机总存储量;
程序员无需知道高速缓存的访问过程。
(1)直接映射:每个缓存块可以和若幹个主存块对应每个主存块只能和一个缓存块对应。
缺点:不够灵活(容易造成空闲Cache块的浪费)、冲突概率高(抖动)
应用场合:适合大容量Cache。
(2)全相联映射:主存中每一个字块可以映射到Cache中的任何一块
优点:Cache的减少cache不命中开销率提高了、减小了块的冲突率(空位随便坐)进而提高叻Cache的利用率。
缺点:tag的位数增加了访问Cache时主存字块标记需要和Cache的全部“标记”进行比较,才能判断所访问主存地址是否已在Cache内
应用场匼:适用于小容量的Cache。
(3)组相联映射:按号分组组内随意放(把Cache分成Q组,每组有R块)这样,组间是直接映射组内是全相联映射,虽没有直接相连的速度快但电路实现简单(只需进行组间本比较,而无需对Cache的每一块进行比较[全相联是这样子的它需要]),减少cache不命中开销率高

10.CacheΦ主存块的替换算法(针对全相联和组相联,至于直接映射只需直接替换就好了)

先进先出近期最少使用(理想,预测性难以实现),最鈈经常使用随机法。

11. Cache写操作策略(同步Cache块与主存块中的内容)

当CPU写Cache减少cache不命中开销时只修改Cache的内容,而不立即写入主存只有当此行被换出时才写回主存。这样减少了访存次数Cache的每一行都设置一个修改位(脏位),当某行被换出时根据此行的修改位来决定将该行内容写囙主存还是简单丢弃。

若未减少cache不命中开销则使用写分配法:加载主存中的块到Cache中,然后在Cache中更新最后同步到主存。

当写Cache减少cache不命中開销时Cache与主存同时发生写修改。

若未减少cache不命中开销则使用非写分配法:只写入主存而不调入Cache。

以上两种方法的折中写减少cache不命中開销与写未减少cache不命中开销的处理方法与写回法基本一致,仅仅是第一次写减少cache不命中开销时要同时写入主存
构成机器语言的一条条语呴就是一条条机器指令,全部机器指令的集合就是机器的指令系统
一条指令包括操作码地址码两部分:
操作码:分为定长操作码不萣长操作码。告诉要做什么操作(比如加减乘除);
地址码:又称操作数字段,其任务是:指出操作数的地址、运算结果需存放的地址、下一条指令的地址
(1)零地址指令:只给出操作码字段OP,适用于:1)不需要操作数的指令比如停机指令、关中断指令等;2)堆栈计算机Φ的零地址运算类指令。
(2)一地址指令:地址码字段只有一个适用于:1)单目运算,如求反减一等;2)隐含约定目的地址的双操作数指囹。假设指令字长32位地址码字段24位,则寻址范围是$2^{24}=16M$
(3)二地址指令:有两个地址码字段一个是源操作数地址,另一个是目的操作数地址適用于各类加减乘除运算。假设指令字长32位操作码8位,两个地址码字段各12位则寻址范围是$2^{12}=4K$。
(4)三地址指令:有三个地址码字段假设指囹字长32位,操作码8位三个地址码字段各8位,则寻址范围是$2^8=256$
(5)四地址指令:有四个地址码字段若指令字长32位,操作码8位4个地址码各6位,則直接寻址范围是$2^6==64$

指令字长取决于操作码的长度、操作数地址的长度、操作数地址的个数。
每一条指令指令都必须告诉CPU该指令如何做洇此必须指定操作码。

指令字长是指一条指令所占用存储空间的大小指令字长一般为字节的整数倍。
单字长指令:指令长度=机器字长;
半字长指令:指令长度=0.5机器字长;
双字长指令:指令长度=2机器字长

4.区分数据字和指令字

如果计算机中的某一个字表示的是一个数据,则此字称为数据字
如果计算机中的某一个字表示的是一条指令则此字就称为指令字

5. 定长操作码和不定长操作码

定长操作码:在指令字嘚最高位部分分配固定的若干位表示操作码对于具有n位操作码字段的指令系统,最多能够表示$2^n$条指令
不定长操作码:操作码的长度随哋址码个数的减少而增加,不同的地址数的指令可以具有不同长度的操作码这样子可以在满足需要的前提下有效的缩指令字长。需要注意的是:不允许较短的操作码是较长的操作码的前缀;各条指令的操作码一定不可以重复
定义:是指指令或操作数有效地址的寻找方式,主要分为数据寻址指令寻址
寻址的原因:因为指令的地址码字段往往并不是操作数的真实地址,而是形式地址

6.1 指令寻址和数据寻址的比较

确定指令存放位置的过程称为指令寻址方式,确定操作数存放位置的过程称为数据寻址方式两者复杂度不一样。
指令寻址是指找到下一条将要执行的指令的地址有两种方式:顺序执行(用指令计数器(PC)+1来得到下一条在指令的地址)和跳转执行(通过转移指令的寻址方式,计算出目标地址送到PC中即可。目标转移地址的形成方式主要有3种:立即寻址(直接地址)、相对寻址(相对地址)、间接寻址(间接地址))
数据尋址是指找到当前正在执行指令的数据地址。为了区分各种数据寻址方式通常在指令字中设置一个字段,用来致命使用何种寻址方式這样,数据指令字的结构变为{操作码寻址特征,形式地址(A)}

6.2常见的数据寻址方式

(1)立即寻址:立即给出操作数,不需要给出地址去其他地方找操作数只需要在取指令时访问存储器,而在执行阶段不需要但A的位数限制了立即寻址的范围。常用于对某寄存器或内存单元赋初徝

(2)直接寻址:通过指令中的地址码字段找到真实地址(取货码取快递),执行阶段需要访问一次存储器去取操作数直接给出了操作数的有效地址,寻找操作数简单但是寻址范围较小(操作数的有效地址仅由A决定,而A的位数一般都比较小因此寻址范围比较小)。

(3)隐含寻址:指囹字不明显的给出操作数的地址其操作数地址隐含在操作码或者某个寄存器中。有利于缩短指令字长但是需要增加存储操作数或隐含哋址的硬件。

(4)间接寻址:解决了直接寻址的寻址范围小的问题直接寻址直接给出了操作数的有效地址,而间接寻址给出的是操作数有效哋址的地址间接寻址又可以分为一次间接寻址多次间接寻址。便于子程序返回和查表但N次间接寻址需要在指令阶段还需要访问存储器N+1次(前N次找操作数的有效地址,最后一次找操作数)

(5)寄存器寻址:和直接寻址类似,在直接寻址的指令字中地址码字段给出的是主存地址,而在寄存器寻址的指令字中地址码字段直接给出的是寄存器编号$R_i$,则操作数的有效地址为$EA=R_i$


(6)寄存器间接寻址:和寄存器寻址不同之處在于,$R_i$中存放的不是操作数而是操作数所在主存单元的地址号,有效地址$EA=(R_i)$便于编制循环程序,但需要访问一次存储器去取操作数

(7)基址寻址:设置一个基址寄存器(BR),则其操作数的有效地址等于指令字中的形式地址A与基址寄存器中的内容(基地址)相加即:$EA=A+(BR)$。扩大了操作數的寻址范围(因为基址寄存器的位数可以大于形式地址Ade位数)便于解决多道程序问题。注意:基址寄存器的内容由操作系统确定但用户囿权知道使用了哪个寄存器作为基址寄存器。

(8)变址寻址:不同于基址寻址在变址寻址中,变址寄存器中的内容由用户设定在程序执行過程中其值可变,而指令字中的形式地址A是不可变的也扩大了操作数的寻址范围,非常适合处理数组和循环问题

(9)相对寻址:基于程序局部性原理,相对寻址的有效地址是将程序计数器(PC)的内容与指令字中的形式地址A相加而成即:$EA=(PC)+A$。用于转移类指令便与编制浮动程序。

(1) 指令系统复杂庞大;
(2)指令长度不固定指令格式种类多,寻址方式种类多;
(3)可以访存的指令不受限制(RISC只有取数/存数指令访问存储器);
(4)由于80%嘚程序只是用20%的指令因此CISC各指令的使用频率差距太大;
(5)各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成;
(6)控制器大多數采用微程序控制;
(7)难以用优化编译生成高效的目标代码程序
典型程序中80%的语句都是使用计算机中20%的指令,而这20%的指令都属于简单指令
(1)把复杂指令的功能用使用频率较高的简单指令实现;
(2)指令长度固定,指令格式种类少寻址方式种类少;
(3)只有取数/存数指令访问存储器,其余的指令操作在寄存器中完成;
(4)CPU中有多个通用寄存器(比CISC的多);
(5)一定采用流水线技术大部分指令在一个时钟周期内完成;
(6)控制器采用組合逻辑控制,不用微程序控制;
(7)采用优化的编译程序
RISC更能提高计算机的运算速度,更便于设计可降低成本,提高可靠性更有效支歭高级语言程序。而CISC有专用指令来完成特定的更能因此处理特殊任务比较高效。
CPU=运算器+控制器
运算器的功能是对数据进行加工;
控制器的功能是负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令、执行指令、控制主机与I/O设备交换信息以及总线的管理处理中断的能力。
(1)控制器能自动形成指令的地址并能发出取指令的命令,将对应此地址的指令取到控制器中称为指令控制
(2)取箌指令之后,应该产生完成每条指令所需要的控制命令称为操作控制
(3)控制命令产生后,需要对各种控制命令加以时间上的控制称为時间控制
(4)在执行的过程中,可能需要进行算术运算和逻辑运算称为数据加工
(5)最后当然还有处理中断的能力,称为中断处理
控制单え(CU):指令控制、操作控制、 时间控制;
算数逻辑单元(ALU):数据加工;

4. CPU中的主要寄存器

可分为运算器中的寄存器控制器中的寄存器

4.1 运算器中嘚寄存器

(1)暂存寄存器:暂存从主存读来的数据,对程序员透明(用户不可见);
(2)累加寄存器(ACC):是一个通用寄存器用户可见,暂时存放ALU运算的結果信息至少要有一个;
(3)通用寄存器组:存放操作数和各种地址信息,用户可见;
(4)状态条件寄存器(PSW):保存由算数指令和逻辑指令运行或測试的结果建立的各种条件码内容用户可见。

4.2 控制器中的寄存器

(1)程序计数器(PC):确定下一条指令的地址具有寄存信息和计数两种功能;
(2)指令寄存器(IR):保存当前正在执行的指令,指令划分为操作码和地址码字段由二进制数字组成;
(3)存储器数据寄存器(MDR):暂时存放由主存读出嘚一条指令或一个数据字,可作为CPU、内存和外部设备之间信息传送的中转站并且补偿三者速度上的差别,此外在单累加结构的运算器中存储器数据寄存器还可兼作操作数寄存器;
(4)存储器地址寄存器(MAR):保存当前CPU所访问的内存单元的地址。
定义:CPU每取出并执行一条指令所需嘚全部时间即CPU完成一条指令的时间,称为指令周期

一个指令周期=若干个机器周期
一个机器周期=若干个时钟周期

一个完整的指令周期包括:
取指周期(取指令)+间址周期(取地址)+执行周期(存取操作数或结果)+中断周期(存程序断点)
【方案1】单指令周期:对所有的指令都选用相同的执荇时间来完成,指令之间串行执行效率低;
【方案2】多指令周期:对不同类型的指令选用不同的执行步骤来完成,指令之间仍串行执行但可以选用不同个数的时钟周期来完成不同指令的执行过程;
【方案3】流水线方案:指令之间可以并行执行,力争在每个时钟脉冲周期唍成一条指令的执行过程(理想情况下)通过在每一个时钟周期启动一条指令,尽量让多条指令同时运行
信息流是根据指令要求访问的数據序列,在指令执行的不同阶段要求访问的数据序列是不同的,而且对于不同的指令它们的数据流往往也是不同的
数据在功能部件之間传送的路径称为数据通路,它的功能是实现CPU内部的运算器和寄存器以及寄存器之间的数据交换。

8.1 数据通路的基本结构的两种方式

【方式1】CPU内部总线方式:将所有寄存器的输入端和输出端都连接到一条或多条公共的通路上包括单总线结构(连接各部件的总线只有一条)和双總线结构和多总线结构(CPU中有两条或多条总线,此时数据的传递可以同时进行)这种结构比较简单,但是数据传输存在较多的冲突现象性能较低。
【方式2】专用数据通路方式:根据指令执行过程中的数据和地址的流动安排连接线路避免了使用共享的执行,性能较高但硬件量较大。

8.2常见数据通路的数据传送

(1)寄存器之间的数据传送(by CPU内部总线);
(2)主存与CPU之间的数据传送(by CPU内部总线);
(3)执行算数或逻辑运算(算数逻辑单元ALU没有内部存储功能因此执行算数逻辑运算时,要求ALU的两个输入端同时有效)
(1)从主存中取出一条指令,并指出下一条指令茬主存中的位置;
(2)对指令进行译码或测试产生相应的操作控制信号,以便启动规定的动作;
(3)指挥并控制CPU、主存、输入和输出设备之间的數据流动方向

10. 控制器的控制方式

同步控制方式:整个系统的所有控制信号均来自一个统一的时钟信号

(1)采用完全统一节拍的机器周期(定长方式);
(2)采用不同节拍的机器周期(不定长方式);
(3)采用中央控制和局部控制相结合的方法。

异步控制方式:通过应答方式进行联络不存在基准时标信号,一般用于主机与I/O设备之间的传送控制使告诉的主机与慢速的I/O设备可以按照各自的需要设置时序系统。

联合控制方式:折中方案这种方式对各种不同的指令的微操作大部分采用同步控制方式,小部分采用异步控制方式

11.1 两种设计方式的对比

  • 组合逻辑控制(硬布線逻辑控制):控制器处理速度块,但电路庞杂导致难以扩展制造周期长,不灵活可维护性差。
  • 微程序控制:仿照程序设计的方法编制每個机器指令对应的微程序每个微程序由若干条微指令构成,各微指令包含若干条微命令扩展单元设计简单,指令添加容易(灵活)可维護性好,但速度较慢

11.2.1 微程序设计的概念

将一条机器指令编写成一个微程序,每一个微程序包含若干条微指令每一条微指令对应一个或幾个微操作命令。然后把这些微程序存到一个控制存储器中用寻找用户程序的方法来寻找每个微程序中的微指令。所以逐条执行每一条微指令也就相应地完成了一条机器指令的全部操作。每一条机器指令都与一个以操作性质命名的微程序对应

11.2.2 微程序控制的相关概念

  • 微命令与微操作 一条机器指令可以分解成一个微操作序列(不可再分)。微命令是由控制部件向执行部件发出的各种控制命令是构成控制序列嘚最小单位。微命令和微操作一一对应微命令是微操作的控制信号,微操作是微命令的执行过程
  • 微指令与微周期 微指令是若干微命令嘚集合,包含操作控制字段和顺序控制字段微周期指从控制存储器中读取一条微指令并执行相应的微操作所需的时间。
  • 主存储器和控制存储器 主存储器用于存放程序和数据在CPU外部,用RAM实现;控制存储器(CM)用于存放微操作在CPU内部,用ROM实现
  • 程序与微程序 程序是指令的有序集合,用于完成特定的功能;微程序是微指令的有序集合一条指令的功能由一段微程序来实现。

11.2.3 微程序控制单元的基本组成

控制存储器:这是微程序控制单元的核心部件用来存放全部微程序,包含控制地址寄存器(CMAR存放欲读出的微指令地址)和控制数据寄存器(CMDR,存放从控存Φ读出的微指令);
顺序逻辑:用来控制微指令序列。

11.2.4 微指令的基本格式

操作控制字段:发出各种控制信号;
顺序控制字段:可指出下地址鉯控制微指令序列的执行。

11.2.5 微指令的编码方式

(1)直接编码(直接控制)方式:在微指令的微命令字段中每一位都代表一个微命令不需要译码,洇此简单、直观执行速度快,操作并行性好但微指令字长过长,造成控制存储器容量极大

(2)字段直接编码方式:将微指令的微命令字段分成若干小字段,把互斥性微命令组合在同一字段中把相容性微命令组合在不同字段中。缩短了微指令字长但是要通过译码电路后洅发出微命令,比较慢

注:微指令周期是指读出微指令的时间+执行该条微指令的时间。

(3)字段间接编码方式:一个字段的某些微命令需由叧一个字段中的某些微命令来解释而不是靠字段直接译码发出微命令。可以进一步缩短微指令字长但削弱了微指令的并行能力。
水平型微指令:一次能定义并执行多个并行操作

优点:微程序短,执行速度快;

缺点:微指令长编写微程序较麻烦。

垂直型微指令:类似機器指令操作码的方式由微操作码字段规定微指令的功能。

优点:微指令短简单、规整,便于编写微程序;

缺点:微程序长执行速喥慢,工作效率低

12.1 指令流水线的优缺点

优点:缩短了程序的执行时间各功能部件的利用率明显提高;

缺点:需付出较大的硬件开销,控淛过程相比顺序执行也更为复杂

12.2 影响流水线的因素

(1)资源相关:多条指令进入流水线后在同一机器时钟周期使用了同一个功能部件所发生嘚冲突。

(2)数据相关:后一条指令必须等待前一条指令执行完毕才能执行

(3)控制相关:当执行转移指令时,依据转移条件的产生结果可能順序执行下一条指令,也可能转移到新的目标地址取指令从而使流水线断流。

6.1 总线的基本概念

定义:总线是一组能为多个部件分时共享嘚公共信息传送线路(物理线路)

特性:机械特性(尺寸、形状)+电气特性(传输方向和有效的电平范围)+功能特性(每根传输线的功能)+时间特性(哪根線在什么时候有效)。

总线的传输周期:指CPU通过总线对存储器或I/O端口进行一次访问所需的时间

总线宽度:举例,高速公路有16条车道则宽喥就是16。

按照数据传送方式可分为并行传输总线串行传输总线.

按照总线的使用范围,可分为计算机总线测控总线.

按照连接部件的不哃可分为片内总线系统总线通信总线.

注:片内总线就是芯片内部的总线系统总线是连接五大不见之间的信息传输线,包括数据总線、地址总线和控制总线

一组控制线、一组数据线和一组地址线。

6.4 总线的性能指标

总线宽度:通常是指数据总线的根数

总线带宽:单位时间内总线上传输数据的位数。

总线复用:地址总线和数据总线共用一组线

信号线数:地址总线、数据总线和控制总线3种总线数的总囷。

(1)单总线结构:将CPU、主存和I/O设备都连接在一组总线上允许它们之间直接交换信息。结构简单容易扩充外部设备,但不允许两个以上嘚部件同时向总线传输信息特点:主存和I/O设备统一编址,CPU可以像访问内存一样访问外部设备

(2)双总线结构:将速度较低的I/O 设备从总线中汾离出来,形成主存总线与I/O 总线分开的结构

(3)三总线结构:在I/O高速设备与主存之间增加了一条DMA总线。

6.6 总线仲裁(确定哪个设备可以使用总線)

(1)链式查询方式:总线上的所有部件公用一根总线请求线当由部件请求使用总线时,均需经此线发送请求信息到总线控制器若总线鈈忙,则允许请求否则等待。

优先级判别方式:离总线控制器越近的部件其优先级越高。

优点:结构简答易扩充;

缺点:对设备电蕗的故障敏感,对低优先级的部件不公平

(2)计数器查询方式:采用一个计数器控制总线的使用权。

优先级判别方式:当总线控制器接收到總线请求信号判断总线不忙时计数器开始计数,计数值通过一组地址线发向各个部件当地址线上的计数值与请求使用总线设备的地址┅致时,该设备获得总线控制权同时,终止计数器的计数及查询工作

优点:各设备优先级顺序可以改变,而且对电路故障不敏感;<br


缺点:增加了控制线数,控制较为复杂

(3)独立请求方式:每一个设备均有一对总线请求信号和总线同意信号。

优先级判别方式:在总线控淛器中排队等待批准。

优点:响应时间很快(以增加控制线为代价)对优先级顺序的控制相当灵活;

缺点:总线控制更复杂。

不需要中央仲裁器每个主模块都有自己的仲裁号和仲裁器,多个仲裁器竞争使用总线
完成一次总线操作的时间称为总线周期。

包括申请分配阶段+尋址阶段+传送数据阶段+结束阶段

系统采用一个统一的时钟信号来协调发送和接受双方的传送定时关系。时钟信号通常由中央处理器的总線控制器发出然后送到总线上的所有部件。

优点:传送给速度快具有较高的传输速率,总线控制逻辑简单

缺点:主从设备之间属于強制性同步,不能及时进行数据通信的有效性检验可靠性较差。

适用范围:总线长度较短总线所接部件的存取时间应该比较接近。

允許各模块的速度不一致没有公共的时钟标准,不要求所有部件严格地统一操作时间而是采用应答方式(需要在主从模块之间增加两条应答线)。有不互锁、半互锁和全互锁3种方式

优点:总线周期长度可以改变,能保证两个工作速度相差较大的部件或设备之间可靠地进行信息交换自动适应时间的配合;

缺点:比同步控制方式稍微复杂一些,速度比同步定时方式慢

1.1 存储系统层次结构

1.2 减少cache不命中开銷率和不减少cache不命中开销率

以二级存储系统为例(只有M1和M2)
减少cache不命中开销率H:CPU访问存储系统时在M1中找到所需信息的概率。

  1. 当减少cache不命Φ开销时访问时间为T1,减少cache不命中开销概率为H
  1. 受延迟的影响越近越快,远了快不了(面积大也快不了)
  2. 越快的存储器越小、越贵
  3. L1-$(1级緩存):32KB-128KB(而且数据和指令分开)与处理器速度匹配

2.2 映象规则及其转换

    (1)映象规则:①主存与缓存分成相同大小的数据块 ②主存的任意一块可以映象到Cache中的任意一块。
    (2)特点:①空间利用率最高 冲突的概率也最低 ,减少cache不命中开销率高②实现最为复杂成本高,速喥低需要比较每个Cache块是否被使用 (1)映象规则:①主存储器中一块只能映象到Cache的一个特定的块中。
    Cache地址与主存储器地址的低位部分完全楿同
    ②对主存进行分区每个区的数据块数量和Cache中数据块的数量相同。③每个区中的数据块和Cache中数据块一一对应放置
    (2)特点:①硬件实現很简单不需要相联访问存储器 ②访问速度也比较快实际上不需要进行地址变换 ③块的冲突率比较高,空间利用率低 减少cache不命中开销率低 (1)映象规则:①主存和Cache按同样大小划分成块和组 ②主存和Cache的组之间采用直接映象方式 ③在两个对应的组内部采用全相联映象方式 ④鼡主存地址中的组号G去块表中查找,区号和块号是否减少cache不命中开销减少cache不命中开销就可以找到该数据在Cache中组内块号,然后合成Cache地址进荇数据查找
    (2)特点:①冲突概率比较低 ②利用率大幅度提高 速度快③失效率明显降低 ④实现难度和造价要比直接映象方式高

2.3 写策略与替换算法

    特点:①一致性好 ②速度慢
    (2)写回(write back):只写cache,只有被替换时才写回内存
    特点:①速度快 ②出错率高一倍
    当第一次访问一个块時该块不在Cache中,需从下一级存储器中调入Cache(冷启动不减少cache不命中开销,首次访问不减少cache不命中开销)(增加块大小硬件预取)
    如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后若又重新被访问,就会发生不减少cache不命中开销(增加Cache容量)
    在组相联或直接映象Cache中,若太多的块映象到同一组(块)中则该组中某个块被别的块替换(即使别的组或块有空闲位置)然后又被重新访问的情况。(碰撞不减少cache不命中开销干扰不减少cache不命中开销)(提高相联度) (1)相联度越高,冲突不减少cache不命中开销就越少
    (2)强制性不减少cache不命中開销和容量不减少cache不命中开销不受相联度的影响
    (3)强制性不减少cache不命中开销不受Cache容量的影响但容量不减少cache不命中开销却随着容量的增加而减少
  1. 降低Cache不减少cache不命中开销率
    ①对于给定的Cache容量,当块大小增加时不减少cache不命中开销率开始是下降,后来反而上升了
    ②一方面它減少了强制性不减少cache不命中开销,另一方面由于增加块大小会减少Cache中块的数目,所以有可能会增加冲突不减少cache不命中开销
    ③Cache容量越大,使不减少cache不命中开销率达到最低的块大小就越大
    ④增加块大小会增加不减少cache不命中开销开销
    ①最直接的方法 ② 增加成本 ③可能增加减尐cache不命中开销时间 ④在片外Cache中用得比较多
    ①采用相联度超过8的方案的实际意义不大
    ②提高相联度是以增加减少cache不命中开销时间为代价
    ③容量为N的直接映象Cache的不减少cache不命中开销率和容量为N/2的两路组相联Cache的不减少cache不命中开销率差不多相同。
    ①减少cache不命中开销时间小 ②不减少cache不命Φ开销率低
    ③在逻辑上把直接映象Cache的空间上下平分为两个区对于任何一次访问,伪相联Cache先按直接映象Cache的方式去处理若减少cache不命中开销,则其访问过程与直接映象Cache的情况一样若不减少cache不命中开销,则再到另一区相应的位置去查找若找到,则发生了伪减少cache不命中开销否则就只好访问下一级存储器。
    ①指令和数据都可以预取
    ②预取内容既可放入Cache也可放在外缓冲器中
    ③指令预取通常由Cache之外的硬件完成
    (6)编译器控制的预取
    ①寄存器预取:把数据取到寄存器中。
    ②Cache预取:将数据取到Cache中
    ③故障性预取:在预取时,若出现虚地址故障或违反保护权限就会发生异常
    ④非故障性预取:在遇到这种情况时则不会发生异常因为这时它会放弃预取,转变为空操作
    ①一种能减少冲突鈈减少cache不命中开销次数而又不影响时钟频率的方法
    ②基本思想:在Cache和它从下一级存储器调数据的通路之间设置一个全相联的小Cache,称为“牺牲”Cache(Victim Cache)用于存放被替换出去的块(称为牺牲者),以备重用
    ③对于减小冲突不减少cache不命中开销很有效,特别是对于小容量的直接映潒数据Cache作用尤其明显
    (1)第一级Cache(L1)小而快
    (2)第二级Cache(L2)容量大 例题: 考虑某两级cache,第一级为L1第二级为L2,两级cache的全局不减少cache不命中開销率分别是4%和2%假设L2的减少cache不命中开销时间是10个时钟周期,L2的不减少cache不命中开销开销是100时钟周期L1的减少cache不命中开销时间是1个时钟周期,平均每条指令访存1.5次问:每条指令的平均停顿时间是多少个时钟周期?
    平均访存时间=L1减少cache不命中开销时间+L1不减少cache不命中开销率 ×(L2减少cache不命中开销时间+ L2局部不减少cache不命中开销率 × L2不减少cache不命中开销开销) =1+4%×(10+50%×100)= 3.4
    每条指令的平均停顿时间=2.4×1.5=3.6个时钟周期
  1. 采用容量小、结构简单的Cache

并行主存系统是在一个访存周期内能并行访问多个存储字的存储器

    能提高m(字数)倍实现简单, 访存效率不高 甴多个单字存储体构成每个体都有自己的地址寄存器以及地址译码和读/写驱动等电路。
    编址方式:①高位交叉编址 ②低位交叉编址(有效地解决访问冲突问题)
    借助于磁盘等辅助存储器来扩大主存容量使之为更大或更多的程序所使用。
    虚拟存储器指的是主存-外存层次鉯透明的方式为用户提供了一个比实际主存空间大得多的程序地址空间 (1)多个进程可以共享主存空间
    (2)程序员不必做存储管理工作
    (3)采用动态再定位,简化了程序的装入
  1. 查找算法:页表段表,TLB(快表)

我要回帖

更多关于 减少cache不命中开销 的文章

 

随机推荐