现代计算机体系结构学习

1.计算机结构概述

1.1冯·诺依曼结构

 

1.1.1特点

       程序由指令组成并和数据一起存放在存储器中,机器按程序指定的逻辑顺序,把指令从存储器中读出来并逐条执行,从而自动完成程序描述的处理工作。

1.1.2优点

       结构简单、成本低

1.1.3缺点

       传统的冯诺依曼结构由于一次执行要分别进行取指令和数据,需要多次访问存储,对性能有影响。

1.1.4解决方法

       将指令和数据分开放置(改进型哈佛结构)。

1.2哈佛结构

1.2.1 特点

       使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

1.2.2 优点

       可以同时取指令和数据,相较冯诺依曼结构能够完成更大数据量的操作。

1.2.3 缺点

       结构复杂

1.2.4 应用

       DSP、目前使用哈佛结构的中央处理器微控制器有很多, Microchip公司的PIC系列芯片,还有摩托罗拉公司MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9ARM10ARM11

       如何区分两种结构,主要看总线,51单片机虽然数据指令存储区是分开的,但总线是分时复用的,所以顶多算改进型的哈佛结构ARM9虽然是哈佛结构,但是之前的版本也还是冯·诺依曼结构。

2.处理器

2.1指令集

2.1.1 CPU的指令集

       CPU的指令集是软件与CPU这两个层级之间的接口, CPU是对这一套CPU指令集的"实例化"

2.1.2 CISC

       Complex Instruction Set Computer(复杂指令及计算机),相对RISC而言指令更强大、更灵活,为了节省存储空间指令采用变长编码,一条指令能完成很多功能,降低了对内存的访问,减小了缓慢的存储器访问对程序性能的影响,最典型的代表是x86

    优点:程序所需的指令数少,减少了程序占用的空间

    缺点:由于指令周期变化很大,变长编码增加了译码的复杂度,不能很好的执行流水线;指令系统庞大,指令功能复杂,指令格式、寻址方式多。

       改进方法:将CISC指令先解码成类似于RISC指令的微操作,之后的执行过程采用RISC内核。

2.1.3 RISC

       基于二八定律,对指令集进行精简,只保留常用的指令,由于简单的指令通常能在一个cycle内完成,所以处理器的频率得以提升,为了更好的执行流水线,降低译码复杂度,采用定长编码,并简化寻址方式,几乎所有的指令都采用寄存器寻址方式,绝不出现存储器间接寻址方式,复杂的寻址方式交给软件用简单的寻址方式合成,通过设置大量的寄存器,将常用的数据保存在寄存器中,减少对存储器的访问提高系统整体性能,代表ARMMIPSPowerDSP

       优点:简化寻址方式,采用定长编码,利于流水。

       缺点:由于指令采用定长编码,程序空间较大,会降低Cache的命中率,降低了程序的执行效率,由于过分的精简指令,RISC处理器与存储器之间的数据交换增多,使性能恶化。

       改进方法:采用简单的变长编码,即没有增加太多译码复杂度,又减少了程序空间和功耗。

 

2.2微架构

       微架构是指在处理器中执行一种给定的指令集的方法。

       并行是提高内核性能的主要方法,并行可以分为时间并行和空间并行,空间并行又可分为指令并行、数据并行和线程并行。

       指令并行和数据并行是底层的并行,更多的由处理器或编译器实现。线程并行是高层的并行,硬件提供支持。

2.2.1 时间并行——流水线

       1.简述流水线

       将指令的执行过程划分为几个节拍,将各节拍并行起来执行,只是在时间上有些许的错位。ARM7采用的3级流水线结构:取指、译码、执行。

       流水线的基本步骤称为节拍,在不考虑其他因素的情况下,一般来说流水线的级数越多,工作效率越高。当一个节拍的执行时间比别的节拍长的时候,流水线的效率并不是最高的,可以采用两种方式来解决这个问题:第一种是拆分长节拍,第二种是增加长节拍的处理单元。

       在流水线设计中,为了确保不同流水线节拍不会相互影响,在每个阶段引入了流水线寄存器来分隔各个流水线节拍,ALU指令的执行节拍可以进一步细分为3个子节拍:

       ①从寄存器堆中读取寄存器的值

       ②进行运算

       ③将运算结果写回到寄存器堆

从寄存器堆读取寄存器值的步骤被放在ID阶段,将运算结果写回通用寄存器被作为一个独立的阶段WB,由于数据要先load到寄存器,参与运算之后再store到存储器,所以多了一个MEM阶段。MIPS将执行过程分为五个阶段。

 

       2.流水线带来的问题

       结构冒险:因为处理器资源冲突,导致的无法实现某些指令的组合。

       解决方法:指令和数据分开单独访问,从而解决这种问题。

       数据冒险:由于流水线使原先有先后顺序的指令同时处理,当出现某些指令的组合的时候,可能会导致使用了错误的数据。

解决方法:①等待正确的数据处理完。②Forwarding:当硬件检测到当前指令源操作数正好在EX/MEM流水线寄存器中时,直接将EX/MEM寄存器的值传递给ALU的输入,而不再从寄存器堆中读取数据。③将上述两种方式结合起来

Memory访问的数据冒险

在Cycle 4, load指令的MEM阶段将存储器中的值装载到MEM/WB寄存器中,在Cycle 5, load指令的WB阶段将MEM/WB寄存器中的值装载到寄存器R1中,而在Cycle 5, store指令的MEM要将寄存器R1的值放到存储器中去,R1的值此时还没有被load指令更新。

并不是每种数据冒险都能用Forwarding解决而不引起Stall。

       sub指令需要R1, 但R1最早也要在Cycle 4才到MEM/WB寄存器中,即使将MEM/WB寄存器直通到EX的输入端,也需要延时一个Cycle才能使用。

       控制冒险:在流水线处理器中,指令是并行处理的,在当前指令正在执行时,后面很多条指令已经完成了取址和译码等步骤。如果此时程序跳转到其他地址去执行,那么后续的这些步骤就白做了,这就是流水线的控制冒险。

       解决方法:①x86使用硬件冲刷流水线来保证发生跳转时,流水线能正确执行,在DSP中改由软件来处理,通过增加NOP来排空流水线。②采用分支预测,处理器采用分支预测来猜测程序进入哪个分支,基于预测结果来取址、译码,如果猜测正确就能节省时间,如果猜测错误,则刷新流水线,在新的地址处取址、译码。分支预测的效果,体现在预测算法的准确性上。

       分支预测算法

1位预测:根据指令上一次是否跳转来预测当前时刻是否跳转,如果跳转指令上一次发生跳转,就预测这一次也会跳转,如果上一次没有跳转,就预测这一次也不会跳转。

       2位预测:每个跳转指令的预测状态信息从1bit增加到2bit计数器,如果这个跳转执行了,就加1,加到3就不加了,如果这个跳转不执行,就减1,减到0就不减了,当计数器值为0和1时,就预测这个分支不执行,当计数器值为2和3时,就预测这个分支执行。2位计数器比1位计数器有更好的稳定性。

       3.指令的相关性

       寄存器相关

       当两条语句共用寄存器时,它们可能相关。

       ①先读后读

       ADD  BX,  AX; BX = AX + BX;

       ADD  CX,  AX; CX =CX + AX;

       实际上没有相关性,调换一下执行顺序对结果没有影响。

       ②先写后读

       ADD  BX,  AX; BX = AX + BX;

       ADD  CX,  BX; CX = BX + CX;

       有数据流动,存在依赖性,称为数据相关。

       ③先读后写

       ADD  BX,  AX; BX = BX + AX;

       MOV  AX,  CX; AX = CX;

       将两条语句调转,执行结果不一样,具有相关性,引起这种相关性的原因是x86对程序员可见的通用寄存器太少了,指令不得不共用寄存器。WAR和RAW相反,也称为反相关。WAR和WAW没有逻辑上的相关性,只是由于共用了一个寄存器而存在相关性,称为伪相关或者名字相关。

       控制相关

       mov

       cmp

       JNZ label

       ADD

       ....

       label: XOR

       JNZ是条件跳转语句,XOR  指令的执行需要依赖于JNZ的结果,这种相关性是由指令的控制流决定的,称为控制相关。

       去除指令的相关性

       ①去数据相关

       去除每条语句间的数据相关,数据相关虽然不能完全消除,但是可以适量减少。

       x = a + b;

       y = x + c;

       z = y + d;

       这三条指令是相关的,如果改成这样:

       x = a + b;

       y = c + d;

       z = x + y;

       去数据相关不是处理器的工作,而是程序员或者编译器的工作。

       ②去控制相关

       投机执行,通过预测来确定跳转指令的目标地址,甚至可以实现将跳转后面的指令提前到跳转之前的乱序执行。由于同时执行两条路径堆资源的损耗太大,所以一般都是预测一条路径,投机执行。

       ③去伪相关

       由于处理器的ISA寄存器数目通常较少,编译器很容易将多个变量对应同一个寄存器,那么将ISA寄存器重新映射到处理器内部的物理寄存器,就可以消除伪相关。

       ④寄存器重命名

         a)将每条指令的目的寄存器映射到新的物理寄存器。

         b)指令的源寄存器映射到ISA寄存器最近映射到的两个物理寄存器。

         c)当本条指令完成后释放该目的寄存器映射的更早的物理寄存器。

       将存在相关关系的指令用到的寄存器,映射到不同的物理寄存器上来取消相关性,因为物理寄存器是会被用完的,所以要实时的释放,在这种策略下,指令完全不需要访问ISA寄存器,只需要访问物理寄存器。

2.2.2 指令并行——超标量与超长指令字

       要提高处理器的性能,就要做到将指令并行起来执行。如果发射单元一次发射多条指令,就有更多的指令能并行处理,根据指令并行的方式,分为超标量和超长指令集架构。
       超标量处理器是在处理器的内部做指令的并行化处理,而超长指令集是将指令的并行化声明在指令的格式中,处理器只需要执行,指令的并行化可以交给编译器完成,也可以是程序员手工写并行汇编代码实现。

       超标量的代价是处理器内部有不少资源用于将串行指令转换成可以并行的指令序列,增加了处理器的功耗和面积。VLIW芯片无需超标量芯片在运行时间协调并行执行时所必须使用的许多复杂的控制电路。而是将许多这类负担交给了编译器去承担。但基于VLIW指令集字的CPU芯片使得程式变得很大,需要更多的内存。更重要的是编译器必须更聪明,一个低劣的VLIW编译器对性能造成的负面影响远比一个低劣的RISC或CISC编译器造成的影响要大。

      

2.2.3线程并行——多线程

       现代程序设计将程序分为了多个线程,每个线程完成各自的功能,组合起来实现一个应用。操作系统采用时间片轮转的方式,隔一段时间切换到新的线程执行。

       硬件多线程:在处理器中多开辟几份线程状态,当线程发生切换时,处理器切换到相应的线程状态执行,比OS层次要快。

       粗粒度:当处理器发现一个线程被长时间中断时,如cache miss,这时处理器切换到其他线程去执行。

       细粒度:处理器每个cycle发射不同线程的指令,由于多线程之间的指令是不相关的,可以乱序并行执行,寄存器重命名不仅处理了线程内指令的相关,也处理了线程间指令的相关。

 

3.存储

3.1 存储器结构层次

3.2 Cache

       空间局部性:当某项数据被访问时,跟他相邻的数据可能很快就会被访问,如数组。

       时间局部性:当某项数据被访问时,在不久的将来他可能还会被访问,如循环。

       为了弥补处理器与内存之间的速度差异,处理器内置一些SRAM做cache,提高处理器访问程序和数据的速度。

3.1.1 层次化管理

       L1 Cache通常和内核同频率,保证速度,L2通常降频使用,降低功耗,Cache的层次化是对速度、功耗的综合考虑的结果。

3.1.2 Cache 的工作方式

       整个cache空间被分为N个line,cache line是cache和内存交换数据的最小单位,整个cache最少包含以下三个部分:

       valid表示数据是否有效,tag存储的是该cache line对应的内存块地址,block存储的是内存在Cache中缓存的数据。

       假设处理器只有一级cache,内核访问数据会现在cache中找,当cache中没有时(cache miss,通常要几十、几百个cycle)cache line的block中,将地址写到相应的tag,并将valid置为1,当下一次内核继续访问这个数据时,发下valid值为1且tag标志匹配,直接从cache中取数据,称为cache hit(几个cycle)。

3.1.3 Cache的映射方式

①全关联映射cache

       内存中的每个line映射到cache中任意一个cache line,缺点是在判断数据是否在cache中时,要将地址和所有cache line的tag进行匹配。

       优点:对cache的利用率高

       缺点:查找困难

②直接映射cache

       将内存按照cache大小分页,这样每个内存地址只会映射到唯一的cache line中,这样tag需要记录page的索引,以C64 DSP的L1P cache为例,地址总线是32bit,L1P大小为16kbyte(14bit表示),每个cache line 32byte(5bit表示),于是tag需要18bit,这样每个32bit的地址被分为了三个部分:

       tag标识cache line属于哪个page,line指示该数据在哪行cache,offset表示数据在cache line中的哪个位置。由此,当控制器要判断一个数据是否在cache中时,首先根据内存地址取出tag和line,根据line找到对应的cache line,如果cache line的tag和取出的tag一致,且valid标志为1,则cache 命中。

       缺点:由于每个内存地址都映射到唯一对应的cache line中,所以会发生冲突问题。

       优点:查找方便

③组关联cache       

       Set-associative Cache将Cache分为多个way,以解决直接映射的冲突问题,Direct-mapped cache = 1-way set associative cache,cache way分的越多,cache way容量会越小,但越难发生cache miss ,同时会导致硬件结构过于复杂,功耗越高,所以不同的处理器会根据自己的应用来设置最佳的cache way数目和cache way 容量。

3.1.4 Cache的置换策略

       cache way用完的时候,再来数据就需要置换其中一个。常用的置换策略有:1.随机替换2.FIFO 3.最近最少使用LRU。3种策略中,LRU的性能最好。

3.1.5 Cache的写方式

       write through(写通)

       每次cpu修改cache中的内容,cache立即更新内存的内容。这种方法涉及到大量的内存访问,效率太低。

       write back(写回)

       在内核修改cache的内容后并不立即修改内存中的内容,而是等到cache line因为某种原因需要从cache中移除是,才更新。这种方式需要判断cache是否被修改,需要增加一个新的标志dirty来标示cache中的数据是否被修改过。

3.1.6 Cache一致性

       多核处理器由于每个核心都有自己的cache,导致信息不对称,即cache的不一致。

       保证cache一致性的底层操作:

       write invalidate(置无效):当一个内核修改了数据,而其他内核上有这个数据时,将其置为无效。

       write update(写更新):当一个内核修改了这份数据,而其他地方有这份数据的复制,就将其更新到最新值。

       两种方式相比较,置无效更简单,但是会导致同一个cache line中其他有用的信息也无效,而写更新会涉及到大量的数据更新操作,不过可以保证只需要更新修改的数据。由于置无效更简单,大多数处理器都使用置无效策略。

3.1.7 导致Cache miss的几种原因

       ①强制缺失(Compulsory miss:第一次访问程序或数据时,不可避免的从内存中缓存,称为强制缺失。

       ②容量缺失(capacity miss:由于cache已满,而新的数据进来导致必须搬移cache中的数据,称为容量缺失。

       ③冲突缺失(conflict miss:由于地址对应的cache line已经被使用而导致的缓存缺失。

3.1.8六种基本的缓存优化方法

       1.增大块大小以降低缺失率

              基于空间局域性,增大块可以减少缺失。

              缺点:增加了缺失代价,可能会增大容量缺失或者冲突缺失。

       2.增大缓存以降低缺失率

              减少容量缺失

              缺点:可能会增加命中时间、成本和功耗。

       3.提高相联程度降低缺失率

              提高相联程度会减少冲突缺失

              缺点:会增加命中时间,相联程度的增加也会增大功耗。

       4.采用多级缓存降低缺失代价

       存储器平均访问时间=命中时间L1 + 缺失率L1 * 缺失代价L1 = 命中时间L1 +缺失率    L1* (命中时间L2 +缺失率L2 * 缺失代价L2)

       局部缺失率:缓存中的缺失数除以对该缓存进行存储器访问的总数

       全局缺失率:缓存中的缺失数除以处理器生成的存储器访问总数

       多级包含:L1的数据总出现在L2中

       多级互斥:L1的数据绝不出现在L2中

       对第一级缓存,着重偏向加速命中,对第二级缓存更多的偏向减少缺失(更高的相联度、更大的块)

       5.为读取缺失指定高于写入操作的优先级,降低缺失代价

              让读取缺失一直等待到写入缓冲区为空或者在发生读取缺失的时候先检查写入缓冲区的值。

       6.在缓存索引期间避免地址转换,以缩短命中时间

              使用一部分页偏移量(虚拟地址和物理地址保持一致的那部分)来索引缓存,在使用索引读取缓存的同时,地址的虚拟部分被转换,标志匹配使用了物理地址。

              优点:缩短了命中时间

              缺点:增加了系统复杂度和对L1缓存大小与结构的限制

3.1.9 缓存性能的10种高级优化方法

       1.缩短命中时间:小而简单的第一级缓存和路预测。

              ①小而简单的第一级缓存

                     使用低相联度可以缩短命中时间。

                     造成第一级缓存有较高相联度的原因:

                     第一、许多处理器访问缓存时至少需要两个时钟周期。

                     第二、几乎所有的缓存都应当是变址寻址的。

                     第三、引入多线程之后,冲突缺失会增加。

              ②采用路预测缩短命中时间

                     缓存中另外保存一些位,用于预测下一次缓存访问组中的路或块。

       2.增加缓存带宽:流水化缓存、多组缓存和无阻塞缓存。

              ①实现缓存访问的流水化,以提高缓存带宽

                     使第一级缓存命中的实际延迟分散到多个时钟周期,从而缩短时钟周期时间、         提高带宽。

              缺点:会减缓命中速度增加了流水线的段数,增加了预测错误分支的代价,延长了         从发出载入指令到使用数据之间的时钟周期数,但更便于采用高相联度的缓存。

              ②采用无阻塞缓存,提高缓存带宽

                     无阻塞缓存允许数据缓存在一次缺失期间继续提供缓存命中,不会再缺失期间         忽略来自处理器的请求,从而降低缺失代价

              ③采用多种缓存,提高缓存带宽

                     将缓存划分为几个相互独立、支持同时访问的缓存组,当访问的请求很自然的         分布在缓存组之间时,分组方式的效果最佳,将地址映射到缓存组的方式影响着存             储器系统的行为,一种简单而有效的映射方式是将缓存块地址按顺序分散在这些缓        存组中。

       3.降低缺失代价:关键字优化,合并缓冲区。

              ①关键字优先和提前启动以降低缺失代价

              有的时候处理器仅需要缓存块的一个字,一旦缓存载入请求字后,立即将其发         出,然后重启处理器。

              关键字优先:首先从存储器中请求缺失的字,在其到达缓存之后立即发送给处理器,             使处理器能够在载入其他字的时候继续执行。

              提前重启动:以正常的顺序提取字,只要被请求的字到达缓存,就将其发送给处理         器,让处理器继续执行。

              在大型缓存块设计中带来好处更大,如果存储块很小,带来的好处很低。

              ②合并写缓冲区以降低缺失代价

                     检查新数据的地址是否与缓冲区中有效项目的地址匹配,如果匹配,就将新数         据与这个项目合并在一起。由于多字写入的速度通常快于每次只写一个字的写入操             作,所以这种优化方法能更高效的使用存储器。

       4.降低缺失率:编译器优化。

                     一些程序中的循环嵌套会以非连续顺序访问存储器中的数据,如果交换一下嵌         套顺序,就可能使程序代码按照数据的存储顺序来访问,通过提高空间局域性来减             少缺失。

       5.通过并行降低缺失代价或缺失率:硬件预取和编译器预取。

              ①对指令和数据进行硬件预取,以降低缺失代价或缺失率

                     在处理器请求之前,预先提取指令和数据。处理器在一次缺失时提取两个块:         被请求块和下一个相邻块,被请求块放在它返回时的指令缓存中,预取块被放在指             令流缓冲区中。如果当前块在指令流缓冲区中,则取消原缓存请求,并发出预取请        求。需要利用未被充分利用的存储器带宽,如果它干扰了迫切需求的缺失内容,反         而会降低性能。

              ②用编译器控制预取,以降低缺失代价或缺失率

3.2虚拟存储

       虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。

       虚拟存储器的能力:①将主存看成存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。②为每个进程提供一定的地址空间,简化了存储器管理。③保护了每个进程的地址空间不被其他进程破坏。

3.3.1 缓存

       因为主存与磁盘的速度差别很大,造成了大的缺失代价,为了减少缺失代价,虚拟页往往很大,典型的是4KB~2MB,且DRAM缓存是全相连的,操作系统系统对DRAM缓存使用了更精密复杂的替换算法,DRAM采用写回的方式完成写操作。

       页表:Page Table Entry,虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE。

       页命中:地址翻译硬件通过虚拟地址为索引寻找字,通过有效位得知字缓存在主存中,根据PTE中的物理存储器地址,构造出这个字的物理地址。

       缺页:DRAM缓存不命中称为缺页,会引发缺页异常,调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,如果该牺牲页被修改过,那么就拷贝回磁盘,无论如何都会修改牺牲页缓存数据的页表条目,反映该牺牲页缓存的数据不再缓存在主存的事实。

       按需页面调度:只有当不命中发生时,才换入页面。

3.3.2 MMU

       Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。有以下几种不同的用途:

       ①重定位:程序的函数方法和预先声明的数据地址均在编译期间决定,MMU允许程序在任何物理地址运行。

       ②为程序分配内存:MMU可以从物理内存零散的页中创建连续的程序空间,使我们能在一个充满固定大小页面的池里分配内存。

       ③隐藏和保护:用户级程序只能访问操作系统所许可的内存区域中的数据。每一页可以独立的制定为可写权限或者写保护权限。

       ④扩展地址空间:有些CPU不能直接访问它们拥有的全部物理空间,只能通过MMU来访问。

       ⑤内存映射对程序的适应化:在MMU的帮助下,程序会使用适合他的地址,比如同一段代码的很多份拷贝可能同时运行在一个操作系统内,MMU可以使它们共享地址。

       ⑥调页能力:通过置换的方式让程序能够在需要时得到必须的资源运行,而不用把程序全部加载进内存。访问未分配空间的程序会导致异常,操作系统通过按需调度让程序继续运行。

3.3.3 TLB

       为了避免页表和程序数据都存放在内存中造成的每次取出或存入数据都需要访问两次内存(查页表取地址和取数据),将页表存放在一个快速缓存中,以减小地址转换时间。

    TLB中的项保存着一个虚地址和一个物理地址的对应关系,由两部分构成:标识和数据。标识中存放的是虚地址的一部分,而数据部分中则存放物理页号、有效位、存储保护信息以及其他一些辅助信息。

       虚拟地址在逻辑上被分为虚拟页号和页偏移量,虚拟页号被发送到TLB,以备变换成物理地址,后者的高位被发送到L1缓存,充当索引。如果TLB匹配命中,将物理页号发送到L1缓存标志检查是否匹配,如果匹配,则是L1缓存命中,块偏移随后为处理器选择该字。

       如果L1缓存核对显示为缺失,则使用物理地址尝试L2缓存。物理地址的中间部分作为L2缓存的索引,将得到的L2缓存标志与物理地址的上半部分对比,检查是否匹配。如果匹配,得到一次L2缓存命中,使用块偏移选择所需要的字送往处理器,在L2缺失时,通过物理地址从存储器获得该块。

    TLB缺失分两种情况

       ①TLB中没有,但内存中有效页表项中有(MIPS通过软件处理),称为变换缺失。 ②内存有效页表项中也没有(异常处理),称为真缺失。

你可能感兴趣的:(现代计算机体系结构学习)