系统架构设计师-第1章计算机组成与体系结构

发布时间 2024-01-10 21:15:42作者: 代码匠心

第1章计算机组成与体系结构

1. 计算机系统组成

计算机系统是一个硬件和软件的综合体,可以把它看成按功能划分的多级层次结构。

系统软件支持应用软件的运行,为用户开发应用软件提供平台,用户可以使用它,但不能随意修改它。常用的系统软件有操作系统、语言处理程序、连接程序、诊断程序和数据库管理系统等。

1.1. 计算机硬件的组成

硬件通常是指一切看得见,摸得到的设备实体。原始的冯•诺依曼(VonNeumann)计算机在结构上是以运算器为中心的,而发展到现在,已转向以存储器为中心了。图1-1所示为计算机最基本的组成框图。

image

  • 控制器。控制器是分析和执行指令的部件,也是统一指挥并控制计算机各部件协调工作的中心部件,所依据的是机器指令。控制器的组成包含如下。
    • 程序计数器PC:存储下一条要执行指令的地址;
    • 指令寄存器IR:存储即将执行的指令;
    • 指令译码器ID:对指令中的操作码字段进行分析解释;
    • 时序部件:提供时序控制信号。
  • 运算器。运算器也称为算术逻辑单元(ArithmeticandLogicUnit,ALU),其主要功能是在控制器的控制下完成各种算术运算和逻辑运算。运算器的组成包含如下。
    • 算术逻辑单元ALU:数据的算术运算和逻辑运算;
    • 累加寄存器AC:通用寄存器,为ALU提供一个工作区,用在暂存数据;
    • 数据缓冲寄存器DR:写内存时,暂存指令或数据;
    • 状态条件寄存器PSW:存状态标志与控制标志(争议点:也有将其归为控制器的)。
  • 主存储器。主存储器也称为内存储器(通常简称为“内存”或“主存”)。存储现场操作的信息与中间结果,包括机器指令和数据。
  • 辅助存储器。辅助存储器也称为外存储器,通常简称为外存或辅存。存储需要长期保存的各种信息。
  • 输入设备。输入设备的任务是把人们编好的程序和原始数据送到计算机中去,并且将它们转换成计算机内部所能识别和接受的信息方式。按输入信息的形态可分为字符(包括汉字)输入、图形输入、图像输入及语音输入等。目前,常见的输入设备有键盘、鼠标、扫描仪等。
  • 输出设备。输出设备的任务是将计算机的处理结果以人或其他设备所能接受的形式送出计算机。目前,最常用的输出设备是打印机和显示器。有些设备既可以是输入设备,同时也可以是输出设备,例如,辅助存储器、自动控制和检测系统中使用的数模转换装置等。

1.2. 计算机系统结构的分类

计算机的发展经历了电子管和晶体管时代、集成电路时代(中小规模、大规模、超大规模、甚大规模、极大规模)。目前,世界最高水平的单片集成电路芯片上所容纳的元器件数量已经达到80多亿个。

  • 存储程序的概念
    • “存储程序”的概念是冯•诺依曼等人于1946年6月首先提出来的,它可以简要地概括为以下几点:
    • 计算机(指硬件)应由运算器、存储器、控制器、输入设备和输出设备五大基本部件组成。
    • 计算机内部采用二进制来表示指令和数据。
    • 将编好的程序和原始数据事先存入存储器中,然后再启动计算机工作。这就是存储程序的基本含义。冯•诺依曼对计算机世界的最大贡献在于“存储程序控制”概念的提出和实现。六十多年来,虽然计算机的发展速度惊人,但就其结构原理来说,目前绝大多数计算机仍建立在存储程序概念的基础上。通常把符合存储程序概念的计算机统称为冯•诺依曼型计算机。当然,现代计算机与早期计算机相比,在结构上还是有许多改进的。随着计算机技术的不断发展,也暴露出了冯•诺依曼型计算机的主要弱点:存储器访问会成为瓶颈。目前,已出现了一些突破存储程序控制的计算机,统称为非冯•诺依曼型计算机,例如,数据驱动的数据流计算机、需求驱动的归约计算机和模式匹配驱动的智能计算机等。
  • Flynn分类
    1966年,Michael.J.Flynn提出根据指令流、数据流的多倍性特征对计算机系统进行分类(通常称为Flynn分类法),有关定义如下。
    • 指令流:指机器执行的指令序列;
    • 数据流:指由指令流调用的数据序列,包括输入数据和中间结果,但不包括输出数据。
    • Flynn根据不同的指令流-数据流组织方式,把计算机系统分成以下四类:
      • 单指令流单数据流(SingleInstructionstreamandSingleDatastream,SISD):SISD其实就是传统的顺序执行的单处理器计算机,其指令部件每次只对一条指令进行译码,并只对一个操作部件分配数据。
      • 单指令流多数据流(SingleInstructionstreamandMultipleDatastream,SIMD):SIMD以并行处理机(矩阵处理机)为代表,并行处理机包括多个重复的处理单元,由单一指令部件控制,按照同一指令流的要求为它们分配各自所需的不同数据。
      • 多指令流单数据流(MultipleInstructionstreamandSingleDatastream,MISD):MISD具有n个处理单元,按n条不同指令的要求对同一数据流及其中间结果进行不同的处理。一个处理单元的输出又作为另一个处理单元的输入。这类系统实际上很少见到。有文献把流水线看作多个指令部件,称流水线计算机是MISD。
      • 多指令流多数据流(MultipleInstructionstreamandMultipleDatastream,MIMD):MIMD是指能实现作业、任务、指令等各级全面并行的多机系统。如多核处理器、多处理机属于MIMD。

1.3. 复杂指令集系统与精简指令集系统

在计算机系统结构发展的过程中,指令系统的优化设计有两个截然相反的方向,一个是增强指令的功能,设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的指令系统来实现,这种计算机系统称为复杂指令系统计算机(ComplexInstructionSetComputer,CISC);另一个是尽量简化指令功能,只保留那些功能简单,能在一个节拍内执行完成指令,较复杂的功能用一段子程序来实现,这种计算机系统称为精简指令系统计算机(ReducedInstructionSetComputer,RISC)。

  • CISC指令系统的特点
    CISC指令系统的主要特点如下:

    • 指令数量众多。指令系统拥有大量的指令,通常有100~250条。
    • 指令使用频率相差悬殊。最常使用的是一些比较简单的指令,仅占指令总数的20%,但在程序中出现的频率却占80%。而大部分复杂指令却很少使用。
    • 支持很多种寻址方式。支持的寻址方式通常为5~20种。
    • 变长的指令。指令长度不是固定的,变长的指令增加指令译码电路的复杂性。
    • 指令可以对主存单元中的数据直接进行处理。典型的CISC通常都有指令能够直接对主存单元中的数据进行处理,其执行速度较慢。
    • 以微程序控制为主。CISC的指令系统很复杂,难以用硬布线逻辑(组合逻辑)电路实现控制器,通常采用微程序控制。
  • RISC指令系统的特点
    RISC要求指令系统简化,操作在单周期内完成,指令格式力求一致,寻址方式尽可能减少,并提高编译的效率,最终到加快机器处理速度的目的。RISC指令系统的主要特点
    如下。

    • 指令数量少。优先选取使用频率最高的一些简单指令和一些常用指令,避免使用复杂指令。只提供了LOAD(从存储器中读数)和STORE(把数据写入存储器)两条指令对存储器操作,其余所有的操作都在CPU的寄存器之间进行。
    • 指令的寻址方式少。通常只支持寄存器寻址方式、立即数寻址方式和相对寻址方式。
    • 指令长度固定,指令格式种类少。因为RISC指令数量少、格式少、相对简单,其指令长度固定,指令之间各字段的划分比较一致,译码相对容易。
    • 以硬布线逻辑控制为主。为了提高操作的执行速度,通常采用硬布线逻辑(组合逻辑)来构建控制器。
    • 单周期指令执行,采用流水线技术。因为简化了指令系统,很容易利用流水线技术,使得大部分指令都能在一个机器周期内完成。少数指令可能会需要多周期,例如,LOAD/STORE指令因为需要访问存储器,其执行时间就会长一些。
    • 优化的编译器:RISC的精简指令集使编译工作简单化。因为指令长度固定、格式少、寻址方式少,编译时不必在具有相似功能的许多指令中进行选择,也不必为寻址方式的选择而费心,同时易于实现优化,从而可以生成高效率执行的机器代码。
    • CPU中的通用寄存器数量多,一般在32个以上,有的可达上千个。大多数RISC采用了Cache方案,使用Cache来提高取指令的速度。而且,有的RISC使用两个独立的Cache来改善性能。一个称为指令Cache,另一个称为数据Cache。这样,取指令和取数据可以同时进行,互不干扰。

1.4. 总线

总线是一组能为多个部件分时共享的公共信息传送线路。共享是指总线上可以挂接多个部件,各个部件之间相互交换的信息都可以通过这组公共线路传送;分时是指同一时刻只允许有一个部件向总线发送信息,如果出现两个或两个以上部件同时向总线发送信息,势必导致信号冲突。当然,在同一时刻,允许多个部件同时从总线上接收相同的信息。

按总线相对于CPU或其他芯片的位置可分为内部总线和外部总线两种。在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为内部总线;外部总线是指CPU与内存RAM、ROM和输入/输出设备接口之间进行通信的通路。由于CPU通过总线实现程序取指令、内存/外设的数据交换,在CPU与外设一定的情况下,总线速度是制约计算机整体性能的最大因素。

按总线功能来划分,又可分为地址总线、数据总线、控制总线三类,人们通常所说的总线都包括这三个组成部分,地址总线用来传送地址信息,数据总线用来传送数据信息,控制
总线用来传送各种控制信号。

2. 存储器系统

存储器是用来存放程序和数据的部件,它是一个记忆装置,也是计算机能够实现“存储程序控制”的基础。在计算机系统中,规模较大的存储器往往分成若干级,称为存储器系统。

传统的存储器系统一般分为高速缓冲存储器(Cache)、主存、辅存三级。主存可由CPU直接访问,存取速度快,但容量较小,一般用来存放当前正在执行的程序和数据。辅存设置在主机外部,它的存储容量大,价格较低,但存取速度较慢,一般用来存放暂时不参与运行的程序和数据,CPU不可以直接访问辅存,辅存中的程序和数据在需要时才传送到主存,因此它是主存的补充和后援。当CPU速度很高时,为了使访问存储器的速度能与CPU的速度相匹配,又在主存和CPU间增设了一级Cache。Cache的存取速度比主存更快,但容量更小,用来存放当前最急需处理的程序和数据,以便快速地向CPU提供指令和数据。因此,计算机采用多级存储器体系,确保能够获得尽可能高的存取速率,同时保持较低的成本。

多层级的存储体系之所以能用低投入换来较高的存取速率,得益于局部性原理。局部性原理是指程序在执行时呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也仅局限于某个区域。程序局部性包括时间局部性和空间局部性,时间局部性是指程序中的某条指令一旦执行,不久以后该指令可能再次执行。产生时间局部性的典型原因是由于程序中存在着大量的循环操作;空间局部性是指一旦程序访问了某个存储单元,不久以后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围内,其典型情况是程序顺序执行。

存储器中数据常用的存取方式有顺序存取、直接存取、随机存取和相联存取四种。

  • 顺序存取:存储器的数据以记录的形式进行组织。对数据的访问必须按特定的线性顺序进行。磁带存储器采用顺序存取的方式。
  • 直接存取:与顺序存取相似,直接存取也使用一个共享的读写装置对所有的数据进行访问。但是,每个数据块都拥有唯一的地址标识,读写装置可以直接移动到目的数据块所在位置进行访问。存取时间也是可变的。磁盘存储器采用直接存取的方式。
  • 随机存取:存储器的每一个可寻址单元都具有自己唯一的地址和读写装置,系统可以在相同的时间内对任意一个存储单元的数据进行访问,而与先前的访问序列无关。主存储器采用随机存取的方式。
  • 相联存取:相联存取也是一种随机存取的形式,但是选择某一单元进行读写是取决于其内容而不是其地址。与普通的随机存取方式一样,每个单元都有自己的读写装置,读写时间也是一个常数。使用相联存取方式,可以对所有的存储单元的特定位进行比较,选择符合条件的单元进行访问。为了提高地址映射的速度,Cache采取相联存取的方式。

2.1. 主存储器

主存用来存放计算机运行期间所需要的程序和数据,CPU可直接随机地进行读/写。主存具有一定容量,存取速度较高。由于CPU要频繁地访问主存,所以主存的性能在很大程度上影响了整个计算机系统的性能。根据工艺和技术不同,主存可分为随机存取存储器和只读存储器。

  • 随机存取存储器

    随机存取存储器(RandomAccessMemory,RAM)既可以写入也可以读出,但断电后信息无法保存,因此只能用于暂存数据。RAM又可分为DRAM(DynamicRAM,动态RAM)和SRAM(StaticRAM,静态RAM)两种,DRAM的信息会随时间逐渐消失,因此需要定时对其进行刷新维持信息不丢失;SRAM在不断电的情况下信息能够一直保持而不会丢失。DRAM的密度大于SRAM且更加便宜,但SRAM速度快,电路简单(不需要刷新电路),然而容量小,价格高。

  • 只读存储器

    只读存储器(ReadOnlyMemory,ROM)可以看作RAM的一种特殊形式,其特点是:存储器的内容只能随机读出而不能写入。这类存储器常用来存放那些不需要改变的信息。由于信息一旦写入存储器就固定不变了,即使断电,写入的内容也不会丢失,所以又称为固定存储器。ROM一般用于存放系统程序BIOS(BasicInputOutputSystem,基本输入输出系统)。

  • 内存编址方法在计算机系统中,存储器中每个单元的位数是相同且固定的,称为存储器编址单位。

    不同的计算机,存储器编址的方式不同,主要有字编址和字节编址。
    内存一般以字节(8位)为单位,或者以字为单位(字的长度可大可小,例如16位或者32位等,在这类试题中,一般会给出字的大小)。
    例如,内存地址从AC000H到C7FFFH,则共有C7FFFFH-AC000H=1BFFFH个地址单元(转换为十进制后,为112KB)。如果该内存地址按字(16bit)编址,则共有112KB - 16位。假设该内存由28片存储器芯片构成,已知构成此内存的芯片每片有16KB个存储单元,则该芯片每个存储单元存储(112KB-16)/(28-16KB)=4位。

2.2. 辅助存储器

  • 磁带存储器磁带存储器是一种顺序存取的设备,其特点包括:存取时间较长,但存储容量大,便于携带,价格便宜。磁带应用的场景越来越少,目前主要用于资料的归档保存。

  • 硬盘存储器在硬盘中,信息分布呈以下层次:记录面、圆柱面、磁道和扇区,如图1-2所示。
    image-1

    一台硬盘驱动器中有多个磁盘片,每个盘片有两个记录面,每个记录面对应一个磁头,所以记录面号就是磁头号,如图1-2(a)所示。所有的磁头安装在一个公用的传动设备或支架上,磁头一致地沿盘面径向移动,单个磁头不能单独地移动。在记录面上,一条条磁道形成一组同心圆,最外圈的磁道为0号,往内则磁道号逐步增加,如图1-2(b)所示。在一个盘组中,各记录面上相同编号(位置)的各磁道构成一个柱面,如图1-2(c)所示。

    若每个磁盘片有m个磁道,则该硬盘共有m个柱面。引入柱面的概念是为了提高硬盘的存储速度。当主机要存入一个较大的文件时,若一条磁道存不完,就需要存放在几条磁道上。这时,应首先将一个文件尽可能地存放在同一柱面中。如果仍存放不完,再存入相邻的柱面内。

    通常将一条磁道划分为若干个段,每个段称为一个扇区或扇段,每个扇区存放一个定长信息块(例如,512个字节),如图1-2(b)所示。一条磁道划分多少扇区,每个扇区可存放多少字节,一般由操作系统决定。磁道上的扇区编号从1开始,不像磁头或柱面编号从0开始。

    在磁盘上进行信息的读写时,首先需要定位到目标磁道,这个过程称之为寻道,寻道所消耗的时间称为寻道时间,定位到目标磁道后,需要定位到目标扇区,此过程通过旋转盘片完成,平均旋转半圈可到目标位置。故磁盘访问时间为:
    磁盘访问时间(存取时间)=寻道时间+旋转延迟时间

2.3. Cache存储器

Cache的功能是提高CPU数据输入输出的速率,突破所谓的“冯•诺依曼瓶颈”,即CPU与存储系统间数据传送带宽限制。高速存储器能以极高的速率进行数据访问,但因其价格高昂,如果计算机的内存完全由这种高速存储器组成,则会大大增加计算机的成本。通常在CPU和内存之间设置小容量的Cache。Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善,仿佛其存储系统容量与内存相当而访问速度近似Cache。

Cache通常采用相联存储器(ContentAddressableMemory,CAM)。CAM是一种基于数据内容进行访问的存储设备。当对其写入数据时,CAM能够自动选择一个未用的空单元进行存储;当要读出数据时,不是给出其存储单元的地址,而是直接给出该数据或者该数据的一部分内容,CAM对所有存储单元中的数据同时进行比较,并标记符合条件的所有数据以供读取。由于比较是同时、并行进行的,所以,这种基于数据内容进行读写的机制,其速度比基于地址进行读写的方式要快很多。

  • Cache基本原理

    使用Cache改善系统性能的依据是程序的局部性原理。根据程序的局部性原理,最近的、未来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中。这样,就可以把目前常用或将要用到的信息预先放在Cache中。当CPU需要读取数据时,首先在Cache中查找是否有所需内容,如果有,则直接从Cache中读取;若没有,再从内存中读取该数据,然后同时送往CPU和Cache。如果CPU需要访问的内容大多都能在Cache中找到(称为访问命中),则可以大大提高系统性能。

    如果以h代表对Cache的访问命中率(“1-h”称为失效率,或者称为未命中率),t1表示cache的周期时间,t2表示内存的周期时间,以读操作为例,使用“Cache+主存储器”的系统的平均周期为t3。则:t3=t1′h+t2′(1-h)

    系统的平均存储周期与命中率有很密切的关系,命中率的提高即使很小也能导致性能上的较大改善。

    例如,设某计算机主存的读/写时间为l00ns,有一个指令和数据合一的Cache,已知该Cache的读/写时间为10ns,取指令的命中率为98%,取数的命中率为95%。在执行某类程序时,约有1/5指令需要存/取一个操作数。假设指令流水线在任何时候都不阻塞,则设置Cache后,每条指令的平均访存时间约为:(2%′100ns+98%′10ns)+1/5′(5%′100ns+95%′10ns)=14.7ns

  • 映射机制

    当CPU发出访存请求后,存储器地址先被送到Cache控制器以确定所需数据是否已在Cache中,若命中则直接对Cache进行访问。这个过程称为Cache的地址映射(映像)。在Cache的地址映射中,主存和Cache将均分成容量相同的块(页)。常见的映射方法有直接映射、全相联映射和组相联映射。

    • 直接映像

      直接映像方式以随机存取存储器作为Cache存储器,硬件电路较简单。在进行映像时,主存地址被分成三个部分,从高到低依次为:区号、页号以及页内地址,如图1-3所示。
      image-3

      在本例中,内存容量为1GB,Cache容量为8MB,页面的大小为512KB。直接映像中,先分区,再分页。一个区的大小就是Cache容量的大小,所以一共分:1GB/8MB=128个区,区号7位。每个区分:8MB/512KB=16个页,所以页号为4位。

      在直接映像方式中,每个主存页只能复制到某一固定的Cache页中,如图1-4所示。直接映像方式的映像规律是:主存中每个区的第0页,只能进入到Cache的第0页。即:若当前时刻Cache中0号页已被占据,而1-15号页空闲,现在要将1区第0页(即内存的16页)调入Cache是会发生冲突的。所以直接映像的块冲突率非常高。

      在Cache中,为每一个页设立一个Cache标记,该标记用于识别当前的Cache块来自于哪个内存页。直接映像中,由于每个区的N号页,都必须进入到Cache的N号页,所以只需要记录区号即可。所以此时标记位的长度是7位。

      直接映像方式的优点是比较容易实现,缺点是不够灵活,有可能使Cache的存储空间得不到充分利用。image-2

    • 全相联映像

      全相联映像使用相联存储器组成的Cache存储器。在全相联映像方式中,主存的每一页可以映像到Cache的任一页。如果淘汰Cache中某一页的内容,则可调入任一主存页的内容,因而较直接映像方式灵活。

      在全相联映像方式中,主存地址分为两个部分,分别为地址部分(主存页标记)和数据部分(页内地址)。数据部分用于存放数据,而地址部分则存放该数据的存储器地址。如图1-5所示。

      image-4

      全相联映像方式的Cache组织如图1-6所示。

      image-5

      当进行映像时,在我们给定的例子中,当程序访存时,则高11位给出主存页号,低19位给出页内地址。因为每个Cache页可映像到2048个主存页中的任一页,所以每页的Cache标记也需要11位,以表明它现在所映像的主存页号。因此,Cache标记信息位数增加,比较逻辑成本随之增加。

      在全相联映像方式中,主存地址不能直接提取Cache页号,而是需要将主存页标记与Cache各页的标记逐个比较,直到找到标记符合的页(访问Cache命中),或者全部比较完后仍无符合的标记(访问Cache失败)。因此这种映像方式速度很慢,失掉了高速缓存的作用,这是全相联映像方式的最大缺点。如果让主存页标记与各Cache标记同时比较,则成本又太高。全相联映像方式因比较器电路难于设计和实现,只适用于小容量Cache。

    • 组相联映

      组相联映像(页组映像)介于直接映像和全相联映像之间,是这两种映像的一种折衷方案。全相联映像方式以页为单位,可自由映像,没有固定的对应关系。直接映像方式中,主存分组,主存组内的各页与Cache的页之间采取的是固定的映像关系,但各组均可映像到

      Cache中。在组相联映像方式中,主存与Cache都分组,主存中一个组内的页数与Cache的分组数相同,如图1-7所示。

      image-6

      在图1-7给出的例子中,主存分128个区,每个区8个组,每个组2个页。组相联映像方式的主存地址组织如图1-8所示。

      image-7

      组相联映像的规则是:主存中的组与Cache的组形成直接映像关系,而每个组内的页是全相联映像关系。如主存1区0页,他在0组中,所以只能进入Cache的0组中,至于进入到Cache的0组0页,还是0组1页,并无强制要求,可任意放置。

      在组相联映像中,Cache中每一页的标记位长度为8位,因为此时除了要记录区号,还得记录组号,即区号7位加组号1位等于8位。

      容易看出,如果Cache中每组只有一页,则组相联映像方式就变成了直接映像方式。如果Cache中每组页数为16页(即Cache只分一组),则就是全相联映像。因此,在具体设计组相联映像时,可以根据设计目标选取某一折衷值。

      在组相联映像中,由于Cache中每组有若干可供选择的页,因而它在映像定位方面较直接映像方式灵活;每组页数有限,因此付出的代价不是很大,可以根据设计目标选择组内页数。

  • 替换算法

    当Cache产生了一次访问未命中之后,相应的数据应同时读入CPU和Cache。但是当Cache已存满数据后,新数据必须替换(淘汰)Cache中的某些旧数据。最常用的替换算法有以下三种:

    • 随机算法。这是最简单的替换算法。随机法完全不管Cache块过去、现在及将来的使用情况,简单地根据一个随机数,选择一块替换掉。
    • 先进先出(FirstInandFirstOut,FIFO)算法。按调入Cache的先后决定淘汰的顺序,即在需要更新时,将最先进入Cache的块作为被替换的块。这种方法要求为每块做一记录,记下它们进入Cache的先后次序。这种方法容易实现,而且系统开销小。其缺点是可能会把一些需要经常使用的程序块(如循环程序)替换掉。
    • 近期最少使用(LeastRecentlyUsed,LRU)算法。LRU算法是把CPU近期最少使用的块作为被替换的块。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为“年龄计数器”的硬件或软件计数器,用以记录其被使用的情况。
  • 写操作

    因为需要保证缓存在Cache中的数据与内存中的内容一致,相对读操作而言,Cache的写操作比较复杂,常用的有以下几种方法。

    • 写直达(writethrough)。当要写Cache时,数据同时写回内存,有时也称为写通。当某一块需要替换时,也不必把这一块写回到主存中去,新调入的块可以立即把这一块覆盖掉。这种方法实现简单,而且能随时保持主存数据的正确性,但可能增加多次不必要的主存写入,会降低存取速度。
    • 写回(writeback)。CPU修改Cache的某一块后,相应的数据并不立即写入内存单元,而是当该块从cache中被淘汰时,才把数据写回到内存中。在采用这种更新策略的cache块表中,一般有一个标志位,当一块中的任何一个单元被修改时,标志位被置“1”。在需要替换掉这一块时,如果标志位为“1”,则必须先把这一块写回到主存中去之后,才能再调入新的块;如果标志位为“0”,则这一块不必写回主存,只要用新调入的块覆盖掉这一块即可。这种方法的优点是操作速度快,缺点是因主存中的字块未随时修改而有可能出错。
    • 标记法。对Cache中的每一个数据设置一个有效位。当数据进入Cache后,有效位置“1”;而当CPU要对该数据进行修改时,数据只需写入内存并同时将该有效位置“0”。当要从Cache中读取数据时需要测试其有效位,若为“l”则直接从Cache中取数,否则,从内存中取数。

3. 流水线

流水线技术把一个任务分解为若干顺序执行的子任务,不同的子任务由不同的执行机构 负责执行,而这些机构可以同时并行工作。在任一时刻,任一任务只占用其中一个执行机构,这样就可以实现多个任务的重叠执行,以提高工作效率。

3.1. 流水线周期

流水线应用过程中,会将需要处理的工作分为 N 个阶段,最耗时的那一段所消耗的时 间为流水线周期。如:使用流水线技术执行 100 条指令,每条指令取指 2ms,分析 4ms,执行 1ms,则流水线周期为 4ms。

3.2. 计算流水线执行时间

延续上面的场景,将 1 个任务的执行过程可分成 N 个阶段, 假设每个阶段完成时间 为 t,则完成该任务所需的时间即为 Nt。若以传统的方式,则完成 k 个任务所需的时间是 kNt;而使用流水线技术执行, 且花费的时间是 Nt+(k-1)t。也就是说, 除了第 1 个任务需要 完整的时间外,其他都通过并行,节省下了大量的时间。所以流水线的执行时间可通俗的表达为:流水线执行时间=第 1 条指令的执行时间+(n-1)流水线周期
注:n代表需要处理的任务数量。

在考试时,又需要特别注意一个细节问题,流水线的执行时间计算,其实进一步可以分理论情况与实践情况两种不同的处理方式。下面以实例进行说明。
例:某计算机系统, 一条指令的执行需要经历取指(2ms)、分析(4ms)、执行(1ms)三个阶段, 现要执行 100 条指令,利用流水线技术需要多长时间?

理论上来说,1 条指令的执行时间为:2ms+4ms+1ms=7ms。所以: 理论流水线执行时间=2ms+4ms+1ms+(100-1)4=403ms。

而实际上,真正做流水线处理时,考虑到处理的复杂性,会将指令的每个执行阶段的时 间都统一为流水线周期, 即 1 条指令的执行时间为:4ms+4ms+4ms=12ms 。 所以: 实际流水线执行时间=4ms+4ms+4ms+(100-1)-4=408ms。

3.3. 流水线的吞吐率

流水线的吞吐率(Though Put rate ,TP)是指在单位时间内流水线所完成的任务数量或 输出的结果数量。有些文献也称为平均吞吐率、实际吞吐率。计算流水线吞吐率的最基本的公式如下:
image-8

3.4. 流水线的加速比

在流水线中,因为在同一时刻,有多个任务在重叠地执行,虽然完成一个任务的时间与单独执行该任务相近(甚至由于分段的缘故,可能更多一些),但是从整体上看完成多个任务所需的时间则大大减少。

完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比称为流水线 的加速比(speedup ratio)。如果不使用流水线,即顺序执行所用的时间为T0,使用流水线的执行时间为Tk,则计算流水线加速比的基本公式如下:
image-9
如果流水线各个流水段的执行时间都相等(设为Dt),则一条k段流水线完成n个连续任务所需要的时间为(k+n-1)Dt。如果不使用流水线,即顺序执行这n个任务,则所需要的时间为nkDt。因此,各个流水段执行时间均相等的一条k段流水线完成n个连续任务时的实际加速比为
image-10

代码匠心