中央处理器

中央处理器

一、程序执行概述

1.程序及指令的执行过程

指令周期:CPU取出并执行一条执行的时间。

CPU为了能完成指令序列的执行,它必须要解决以下一些列问题:

  • 如何判定每条指令有多长?
  • 如何确定每条指令的操作类型?
  • 如何确定哪些位是寄存器编号、移位位数或立即数?
  • 如何确定操作数是在寄存器中还是在存储器中?
  • 一条指令执行结束后如何正确地读取到下一条指令?

CPU执行一条指令的大致过程是:
①取指令:取指令的操作就是从PC所指出的存储单元中取出指令送到指令寄存器(IR)。
②指令译码:CPU应根据不同的指令操作码译出不同的控制信号。
③计算源操作数地址并取操作数:
若源操作数是寄存器中的数据,则直接从寄存器取数后,转到下一步进行数据操作。
若是存储操作数,则需要访问存储器。在访问之前,需要根据寻址方式确定源操作数地址计算方式。
④执行数据操作
⑤计算目的操作数地址并存结果
⑥指令地址计算并将其送PC。

2.CPU的基本功能和基本组成

1.CPU的基本职能
就是周而复始地执行指令,机器指令执行过程中的全部操作数都是由CPU中的控制器控制执行的。

2.CPU最基本的部件

  • 数据通路(datapath)
  • 控制部件(control unit)

3.CPU的基本组成
①程序计数器(PC)
PC又称指令计数器或指令指针寄存器(IP),
用来存放即将执行指令的地址。(下一条指令的地址)

②指令寄存器(IR)
IR用以存放现行指令。

③指令译码器(ID)
指令译码器对指令寄存器中的操作码部分进行分析解释,产生相应的译码信号提供给操作控制信号形成部件,以产生控制信号。

④启停控制逻辑
启停控制逻辑控制时序信号的发生与停止,并实现对机器的启动与停机。

⑤时序信号产生部件
该部件以时钟脉冲为基础,产生不同指令对应的周期、节拍、工作脉冲等时序信号,实现机器指令执行过程的时序控制。

⑥操作控制信号形成部件
该部件综合时序信号、指令译码信号和执行部件反馈的条件标志(如CF、SF、ZF和OF)等,形成不同指令的操作所需要的控制信号。

⑦总线控制逻辑
实现对总线传输的控制,包括对数据和地址信息的缓冲与控制,
其中包括:

  • 用来缓存数据信息的存储数据寄存器MDR
  • 用来缓存地址信息的存储器地址寄存器MAR。

CPU对于存储器的访问通过总线进行,CPU将存储访问命令(即读写控制信号)送到控制线,将要访问的存储单元地址送到地址线,并通过数据线取指令或者存储器交换数据信息。

⑧中断机构
实现对异常情况和外部中断请求的处理。

3.打断程序正常执行的事件

1.打断程序正常执行的事件
①对指令操作码进行译码时,发现是不存在的“非法操作码”;
②在访问指令或数据时,发现要读取的指令和数据不在主存中;
③在ALU中运算的结果发生溢出,或者整数除法指令的除数为0;
④在执行过程中,CPU外部发生了采样计时时间到、网络数据包到达网络适配器、磁盘完成数据读写等外部事件,要求CPU中止当前程序的执行,转去执行专门的外部事件处理程序。

2.基本概念
①异常控制(或中断机制):CPU除了能正常执行指令以外,还必须具有程序正常执行被打断时的处理机制。
②中断机构:CPU中相应的异常和中断处理逻辑。

3.异常和中断
所有这些打断程序正常执行的事件被分为两大类:异常和中断。
①异常
异常是指由CPU内部的异常引起的意外事件。

  • 硬故障中断是由于硬连线路出现异常而引起的,
    如电源掉电、校验线路错等。
  • 程序性异常是由CPU执行某条指令而引起的发生在CPU内部的异常事件。
    如除数为0、溢出、断点、单步跟踪、寻址错、访问超时、非法操作码、栈溢出、缺页、地址越界(段错误)等。

②中断
程序执行过程中,若外设完成任务或发生某些特殊事件,设备控制器会向CPU发中断请求,要求CPU对这些情况进行处理。这类事件与执行的指令无关,由CPU外部的I/O硬件发出,所以,称为I/O中断或外部中断,需要通过外部中断请求线向CPU请求。

二、数据通路基本结构和定时

数据通路:将指令执行过程中数据所经过的路径,包括路径上的部件称之。
执行部件或功能部件:通常把数据通路中专门进行数据运算的部件称之。
数据通路由控制部件发出的控制信号进行控制。

1.数据通路基本结构

指令执行所用到的元件有两类:

  • 组合逻辑元件(也称操作元件)
  • 时序逻辑元件(也称状态元件或存储元件)

连接这些元件的方式有两种:

  • 总线方式
  • 分散连接方式

数据通路就是由操作元件和存储元件通过总线或分散方式连接而成的进行数据存储、处理和传送的路径。

①操作元件
组合逻辑元件的输出只取决于当前的输入。若输入一样,其输出也一样。组合电路的定时不受时钟信号的控制,所有输入信号到达后,经过一定的逻辑门延迟,输出端的值被改变,并一直保持其值不变,直到输入信号改变。
②状态元件
状态元件具有存储功能,输入状态在时钟控制下被写到电路中,并保持电路的输出值不变,直到下一个时钟到达。输入端状态由时钟决定何时被写入,输出端状态随时可以读出。

2.数据通路的时序控制

1.早期计算机的定时方式
通常采用机器周期、节拍和脉冲三级时序对数据通路操作进行定时控制。
①机器周期:一个指令周期可分为取指令、读操作数、执行并写结果等多个基本工作周期,这些基本工作周期称之。
每个机器周期的实际时间长短可能不同。机器周期的宽度通常以主存工作周期为基础来确定。
②节拍:一个机器周期内要进行若干步动作,将一个机器周期再划分成若干节拍,每个动作在一个节拍内完成。
③脉冲:为了产生操作控制信号并使某些操作能在一拍时间内配合工作,常在一个节拍内再设置一个或多个工作脉冲。

2.现代计算机的定时方式
现代计算机中,整个数据通路中的定时信号就是时钟信号,一个时钟周期就是一个节拍,CPU的主频就是时钟信号的频率。

三、数据通路基本工作原理

1.总线结构数据通路

4abae95a7cbcf254c62df4837f58651.png

单总线数据通路结构中,几种基本操作过程。
1.在通用寄存器之间传送数据
例如,要将寄存器R0的内容传送到寄存器Y,则对应的控制信号取值为:R0out=1,Yin=1,其余寄存器的Rin和Rout信号都为0。
通常称取值为1的Rin和Rout信号为有效控制信号,在描述控制信号取值时,只写出有效控制信号,如“R0out,Yin”。

2.完成算术或逻辑运算
ALU运算的其中一个操作数来自Y寄存器,另一个操作数被置于内总线上。运算结果被临时存放在寄存器Z中。
例如,完成指令“R[R3]<--R[R1]+R[R2]”的有效控制信号如下:
①R1out,Yin
②R2out,add,(Zin)
③Zout,R3in
任何时刻只能将一个寄存器的内容送到内总线,任何一步结束时结果要送到某个寄存器的输入端(即保存到寄存器)。因此,该操作需要三个时钟周期(节拍)。

早期的计算机,其CPU和主存之间采用“异步”方式进行通信。
对于读操作,首先,CPU送出主存单元地址到MAR中,然后,送出一个读信号(read)来启动一次主存读操作,随后等待主存完成读操作。主存一旦完成读操作(即把数据放到MDR中),就向CPU发回一个存储器功能完成(Memory Function Completed,简称MFC)信号,使CPU结束等待状态,并继续执行指令。CPU在等待期间,每个时钟到来时都会采用MFC信号,若检测到MFC信号有效,则表明存储器已将数据读出。为了使CPU能从执行指令状态转入等待状态,需要一个控制信号,这里用WMFC(Wait MFC)表示该控制信号。

3.从内存单元中读取一个字
例如:完成指令R[R2]<---M[R[R1]]有效控制信号如下:
①R1out,MARin
②read,WMFC
③MDRout,R2in
现在主存基本上采用SDRAM芯片,主存与CPU之间大多采用“同步”方式进行通信。“同步”方式下,存储器总是在读信号read发出后的固定几个时钟周期内准备好数据,所以CPU不必等待主存发回MFC信号也即,“同步”方式下第②步不需要WMFC信号。

R1out,MARin ——取R1地址,存到MAR(主存地址寄存器)
read,WMFC —— 读R1地址对应的主存(R1里的是地址,这里读到的才是数据)
MDRout,R2in ——从MDR(主存数据寄存器)读数据写入到寄存器R2

4.把一个字写入内存单元
例如,完成指令M[R[R2]]<---R[R1]的有效控制信号如下:
①R1out,MDRin
②R2out,MARin
③write,WMFC

R1out,MDRin ——取R1数据,存到MDR(主存数据寄存器)
R2out,MARin ——取R2地址,存到MAR(主存地址寄存器)
write,WMFC ——R1数据写入到R2地址对应的主存

MAR:主存地址寄存器
用来保存数据被传输到的位置的地址或者数据来源位置的地址。

MDR:主存数据寄存器
保存要被写入地址单元或者从地址单元读出的数据。

题目.png
取指阶段.png
指令执行阶段.png

所有操作的取指阶段是相同的,不同的是指令执行阶段。

2.单周期数据通路

单周期处理器是指其所有指令的指令周期都为一个时钟周期,单周期数据通路即是单周期处理器的数据通路。因而,在单周期数据通路中,取指令、译码、取操作数、执行运算、存结果、更新PC等所有操作都需要在一个时钟周期内完成。
MIPS指令字为32位,按字节编址,每条指令占4个单元。
假定lw指令的地址已经在程序计数器PC中,则lw指令的执行过程:
第一步:取指令并执行PC加4。
将PC的内容作为地址访问指令寄存器,经过一段时间后读出指令I;同时,在加法器(Adder)中执行PC加4。

第二步:指令译码并取出操作数。
将指令I中的OP字段(I:31~26)送到指令译码器进行译码,产生各种控制信号,例如:
Extop=1,RegWr=1,MenR=1,MenW=0等;
同时,将指令I中的rs字段(I:2521)、rt字段(I:2016)分别送通用寄存器组的Ra、Rb输入端,经过一段时间后,寄存器Ra、Rb中的内容分别从Da、Db输出端被送到busA和busB。此外,指令I中的立即数字段(I:15~0)被送到扩展器。

第三步:计算操作数地址。
在Extop=1的控制下进行符号扩展,在ALUSrc的控制下选择扩展器的输出结果与busA送来的操作数在ALU中进行“加”运算。ALU的操作控制信号(例如“加”运算控制信号)由ALU控制器根据控制信号ALUop和funct字段(I:5~0)产生。

第四步:读出操作数。
将ALU中“加”运算的结果作为地址访问数据存储器,在MemR=1和MemW=0的控制下进行存储器读操作,经过一段时间后,在Dout输出端得到读出的操作数。

第五步:写结果。
指令执行的结果可能是ALU运算的结果,也可能是从数据存储器读出的数据,到底是哪个作为结果,由控制信号MemtoReg来控制二路选择器输出(lw指令应选择从Dout处输出的数据作为结果,因而控制信号MemtoReg=0),并送到通用寄存器组的Dw输入端;目的寄存器可能是rt字段(I:2016),可能是rd字段(I:1511),到底哪个是目的寄存器,由控制信号RegDst来控制二路选择器输出(lw指令应选择rt字段作为目的寄存器,因此控制信号RegDst=0),并送到通用寄存器的Rw输入端。最后在“寄存器写使能”控制信号RegWr(lw指令时RegWr=1)的控制下,将Dw处的数据写入Rw寄存器中。

四、流水线方式下指令的执行

1.指令流水线的基本原理

一条指令的执行可被分成若干阶段,每个阶段都在相应的功能部件中完成。如果将各阶段看成相应的流水段,则指令的执行过程就构成了一条指令流水线。例如,假定一条指令流水线由如下5个流水段组成。
取指令(IF):根据PC的值从存储器取出指令并更新PC。
指令译码(ID):产生指令执行所需要的控制信号。
取操作数(OF):读取存储器操作数或寄存器操作数。
执行(EX):对操作数完成指定操作。
写回(WB):将操作数结果写入寄存器或存储器。

指令流水线的基本原理.png

2.MIPS指令流水线

MIPS指令系统中最复杂的指令需要5个阶段完成操作,因此,MIPS指令流水线数据通路通常用一个五段流水线实现,其执行过程以及功能段划分说明如下:
取指(Ifetch):取指令并PC加4(因为每条指令占4个单元)。
译码/取数(Reg/Dec):读取寄存器内容并对指令译码。
执行(Exec):进行算术运算或逻辑运算(包括传送操作)。
访存(Mem):存储器读数据或写数据。
写回(Write):选择存入寄存器的结果并将其在寄存器输入端稳定保持一段建立时间。

1.R-型指令的功能段划分

R型指令的功能段划分.png

2.I-型指令的功能段划分
I-型指令有三种类型:

  • 带立即数运算类指令
  • 访存类指令(lw/sw)
  • 分支指令(条件转移类指令)

①I-型带立即数运算类指令
I-型运算类指令的功能段划分与R-型指令的功能段划分是类似的。

②访存类指令包括装入指令(如lw指令)和存数指令(如sw指令)

  • lw指令的功能段比R-型指令的功能段增加了一个Mem功能段(在Exec功能段与Write功能段之间),它实现从存储单元中读数据的功能。
  • sw指令的功能段与R-型指令的功能段相似,只是把最后一个Write功能段改为Mem功能段。

分支指令包括beq指令和bne指令等。例如,beq指令的汇编形式为:“beq rs,rt,imm16”,指令的功能如下:

if R[rs]=R[rt]
  PC<--PC+4+4*imm116
else
  PC<--PC+4

beq指令除两个公共的功能段外,Exec功能段对R[rs]和R[rt]做减法,同时计算转移目标地址PC+4+4*imm16;Mem功能段根据R[rs]和R[rt]是否相等来确定是否转移目标地址送PC;Write功能段为空操作。

3.J-型指令的功能段划分
J-型指令就是无条件转移指令,其功能段的划分很简单,除两个公共的功能段外,就只有一个功能段Exec,用于生成转移目标地址并送PC。

流水线数据通路的设计原则是:
指令流水段个数以最复杂指令所用的功能段个数为准;
流水段的长度以最复杂功能段的操作所用时间为准。

为了说明MIPS指令流水线的实现,假定MIPS指令流水线中每个阶段的实际执行时间如下:
①取指:200ps;
②译码/取数:50ps;
③执行:100ps;
④访存:200ps;
⑤写回:50ps。
不考虑控制单元、PC访问、信号传递等延迟,那么,一条指令的总执行时间为:200+50+100+200+50=600ps。

2.png

在最长200ps的延时后,各组合逻辑的处理结果被送到各自的流水段寄存器的输入端并稳定50ps,因此,在不考虑控制单元、PC访问、信号传递等延迟的情况下,时钟周期为200+50=250ps=25010^(-12)秒。
每条指令都被划分为5个流水段,因此,每条指令的延时为250ps
5=1.25ns,比串行执行时一条指令的执行时间增加了650ps,这其中一部分时间是由于每个水流段后增加了一个写流水段寄存器的时间造成的,这是额外开销,流水线划分得越细这个额外开销越大。
在单周期数据通路中,所有指令的执行都是先在一个组合逻辑部件中完成规定的所有操作,包括:取指令并计算PC+4、译码并取出rs和rt中的操作数、ALU计算、取存储器操作数等、然后将得到的结果送到状态元件(如通用寄存器)中,因此单周期数据通路可以抽象成组合逻辑和状态元件组成。

3.适合流水线的指令集特征

按流水线方式执行指令关键之处是,将指令集中所有指令都分成相同数目的功能段,并让每个功能段的执行时间都相同。
适合流水线的指令集特性:
①指令长度应尽量一致。
②指令格式应尽量规整,尽量保证源寄存器的位置相同。
③采用load/store型指令风格。所谓load/store型指令风格,是指指令集中只有load指令和store指令能访问存储器,其他指令一律不能访问,load指令用来把数据从存储单元读出并装入到寄存器,store指令把寄存器的内容写入存储单元。
④为了便于以流水线方式执行指令,数据和指令在存储器中要“对齐”存放。
总之,指令集体系结构的规整、简单和一致等特性有利于指令的流水线执行。

具有什么特征的指令集有利于实现指令流水线呢?
①指令长度应尽量一致。
②指令格式应尽量规整
③采用load/store型指令风格
④为了便于以流水线方式执行指令,数据和指令在存储器中要“对齐”存放。

五、控制器设计基本原理

1.硬连线控制器

根据不同的控制描述方式,可以有硬连线控制器和微程序控制器两种实现方式。
硬连线控制器的基本实现思路是,将指令执行过程中每个时钟周期所包含的控制信号取值看成一个状态。每来一个时钟,控制信号会有一组新的取值,也就是一个新的状态,这样,所有指令的执行过程就可以用一个有限状态转换图来描述。实现时,用一个组合逻辑电路(一般为PLA电路)来生成控制信号,用一个状态寄存器记录状态之间的转换,因此,控制器实际上就是一个有限状态机。

从理论上来说,控制器设计的过程很简单,主要步骤如下:
①根据每条指令的功能,确定每条指令的执行步骤,画出指令执行的流程图。
②给出每条指令在每个步骤中各个控制信号的取值,并在表中列出。
③根据指令和控制信号的关系,写出每个控制信号的逻辑表达式。
④根据逻辑表达式,画出控制器的逻辑电路。

2.微程序控制器

微程序:每条指令的执行过程
微指令:指令执行过程中每个时钟周期所包含的控制信号取值看成是由多个微命令组成的一条微指令。
微命令:每个控制信号对应一个微命令。
微地址:微指令所在存储单元的地址称之。
一个微程序由若干条微指令组成。每个控制信号对应一个微命令,控制信号取不同的值,就发出不同的微命令。
控制存储器(CS):在CPU内部,用于存放微程序的只读存储器,简称控存。

微程序控制器的基本实现思路是,仿照程序设计方法,将每条指令的执行过程用一个微程序来表示。指令执行时,先找到对应的第一条微指令,然后按照特定的顺序取出后续的微指令执行。每来一个时钟,执行一条微指令。
微程序定序器的实现方法有两种:

  • 计数器法
  • 断定法(即下址字段法)

1.计数器法:
计数器法的主要思想是:
使用专门的微程序计数器μPC,将下条微指令地址隐含地存放在μPC中。
顺序执行时,根据μPC+1—>μPC得到下条微指令地址;
转移执行时,在当前微指令后添加一条“转移微指令”,并在微指令中添加专门的“转移控制字段”,将“转移微指令”或“转移控制字段”中的控制信息送到微指令地址发生器,与相应的指令操作码以及条件码等组合,生成转移微地址送μPC。

2.断定法
断定法在微指令中增加一个下地址字段,在该字段中直接给出下条微指令地址,因此也称为下地址字段法。这样,相当于每条都是转移微指令,即使不连续执行也没有关系。

硬连线控制器优缺点:
优点:硬连线路控制器速度快,适合于实现简单、规整的指令系统,如MIPS指令系统
缺点:硬连线路控制器是一个多输入/多输出的复杂、巨大的网状逻辑,对于CISC这种复杂指令系统来说,由于其控制逻辑极其复杂,因而实现起来非常困难,而且维护、扩充和修改都不容易。

微程序控制器优缺点:
微程序控制器因为采用软件设计思想,不管指令多复杂,只要事先将其包含的操作所用的控制信号存储在控存中,就可以在指令执行时将控制信号取出,以控制指令的执行。因而,CISC指令系统大多用微程序控制器实现,不过,因为微程序控制器在每个时钟周期都要访问控制存储器,因而指令执行速度较慢。

名词解释:微程序
将每条指令的执行过程用一个微程序来表示,一个微程序由若干条微指令组成。

六、指令流水线中的冒险处理

1.基本概念

流水线冒险(hazard):指令序列在流水线中执行时,可能会遇到一些情况,使流水线无法正确、按时执行后续指令,从而引起流水线阻塞或停顿(stall),我们称这种现象为流水线冒险。

2.流水线冒险类型

1.结构冒险
也称为硬件资源冲突,引起结构冒险的原因在于同一个部件同时被不同指令所用,也就是说它是由硬件资源竞争造成的。
解决结构冒险的策略有两种:
①规定一个部件每条指令只能使用一次,且只能在特定阶段使用。
②通过设置多个独立的部件来避免资源冲突。

2.数据冒险
也称为数据相关。引起数据冒险的原因在于,后面指令需要读取前面指令的运算结果时,前面指令的结果还没有写入寄存器中。
解决数据冒险的策略有以下多种:
①最简单的是由编译器在数据相关的指令之间加若干nop指令(即空操作指令,除修改PC外其他什么操作都不做)。
②采用数据转发技术,在数据通路中一旦产生运算结果或一旦存储器读出数据,就把它们通过一条旁路直接送到相关后续指令在Exec阶段的ALU输入端,这样,后续相关指令不必等到前面指令把结果写到寄存器后再从寄存器中读出。
③对于无法通过转发来解决,可在load指令后面加一条nop指令;也可以通过硬件阻塞的方式(插入气泡)来延迟load指令随后的一条指令的执行,此时流水线将阻塞一个时钟周期,从而导致程序执行时间长一个时钟周期。
④对于关于寄存器
$8

的数据相关问题,则可以通过对通用寄存器的读写操作进行特殊处理,保证在一个时钟的前半周期进行寄存器写,在后半周期进行寄存器读,这样,lw指令在第6时的前半周期将从存储器取出的内容是写入寄存器dollar8,而or指令则在后半周期从寄存器dollar8中取数。
(由于简书编辑器的问题 ,此处用英文表示dollar符号)
3.控制冒险
在正常情况下,指令在流水线中总是按顺序执行,当遇到改变指令执行顺序的情况时,流水线中指令的正常执行会被阻塞。这种由于发生了指令执行顺序改变而引起的流水线阻塞称为控制冒险。各类转移指令(包括条件转移、无条件转移、调用、返回指令等)以及异常和中断等事件都会改变指令执行顺序,因而都可能会引发控制冒险。
分支指令而引起的控制冒险称为分支冒险(Branc hazards)。对于分支冒险,可采用和前面解决数据冒险一样的硬件阻塞方式(插入气泡)或软件阻塞方式(插入空操作指令)。即,假设延迟损失时间片为C,则在数据通路中检测到分支指令时,就在分支指令后插入C个气泡,或在编译时在分支指令后填入C条nop指令。
但是,插入气泡和插入nop指令这两种都是消极的方式,效率较低。结合分支预测可以降低由于分支冒险带来的时间损失,分支预测有静态预测和动态预测两种。此外,还有延迟分支方式也可部分解决分支冒险问题。

名词解释:流水线冒险
流水线冒险(hazard):指令序列在流水线中执行时,可能会遇到一些情况,使流水线无法正确、按时执行后续指令,从而引起流水线阻塞或停顿(stall),我们称这种现象为流水线冒险。

七、高级流水线基本原理

1.指令级并行的策略

高价流水线技术充分利用指令级并行(Instruction-level parallelism,简称ILP)来提高流水线的性能。有两种增加指令级并行的策略。
1.超流水线(super-pipelining)技术
通过增加流水线级数来使更多的指令同时在流水线中重叠执行。超流水线并没有改变CPI的值,CPI还是1,但是,因为理想情况下流水线的加速比流水段的数目成正比,流水段越多,时钟周期越短,指令吞吐率越高。因此,超流水线的性能比普通流水线好。但是,流水级数越多,用于读写流水段寄存器的开销就越大,因而流水线级数是有限制的,不可能无限增加。

2.多发射流水线技术
通过同时启动多条指令(如整数运算、浮点运算、存储器访问等)独立运行来提高指令并行性。要实现多发射流水线,其前提是数据通路中有多个执行部件。多发射流水线的CPI能达到小于1,因此,有时用CPI的倒数IPC来衡量其性能。
IPC是指每个时钟周期内完成的指令条数。例如,4路多发射流水线的理想IPC为4.

2.实现多发射流水线的任务

实现多发射流水线必须完成以下两个任务:

  • 指令打包
  • 冒险处理

指令打包任务就是将能够并行处理的多条指令同时发送到发射槽中,因此处理器必须知道每个周期能发射几条指令,哪些指令可以同时发射。这通过推测技术来完成,可以由编译器静态调整或由处理器通过猜测指令执行结果动态调整指令执行顺序,是指令的执行能达到最大可能的并行。

指令打包的决策依赖于“推测”的结果,主要根据指令间的相关性来进行推测,与前面指令不相关的指令可以提前执行。
不过,推测仅是“猜测”,有可能推测结果是错误的,故需有推测错误检测和回退机制,在检测到推测错误时,能回退掉被错误执行的指令。因此,错误推测会导致额外开销。需要结合软件推测和硬件推测来进行。
软件推测指编译器通过推测来静态重排指令,此种推测一定要正确。
硬件推测指处理器在程序执行过程中通过推测来动态调度指令。

3.静态多发射和动态多发射

根据推测打包任务主要由编译器静态完成还是由处理器动态执行,可将发射技术分为两类:

  • 静态多发射
  • 动态多发射

静态多发射主要通过编译器静态推测来辅助完成“指令打包”和“冒险处理”。指令打包的结果可看成将同时发射的多条指令合并到一个长指令中。通常将一个时钟周期内发射的多个指令看成一条多个操作的长指令,称为一个“发射包”。所以,静态多发射指令最初称为“超长指令字”(Very Long Instruction Word,WLIW),采用这种技术的处理器被称为VLIW处理器。Intel的IA-64架构采用这种方法,Intel称其为显式并行指令计算机(Explicitly Parallel Instruction Computer,EPIC)。

动态多发射由处理器硬件动态进行流水线调度来完成“指令打包”和“冒险处理”,能在一个时钟周期内执行一条以上指令。采用动态多发射流水线技术的处理器称为超标量处理器。在简单的超标量处理器中,指令按顺序发射,每个周期由处理器决定是发射一条或多条指令,显然,在这种处理器上要达到较好的性能,很大程度上依赖于编译器。为了更好地发挥超标量处理器的性能,多数超标量处理器都结合动态流水线调度技术,处理器通过指令相关性检测和动态分支预测等手段,投机性地不按指令顺序执行,当发生流水阻塞时,根据指令的依赖关系,动态地到后面找一些没有依赖关系的指令提前执行。这种指令执行方式称为乱序执行。

简答题:简述增加指令级并行的策略
增加指令级并行的策略有两种:
一种是超流水线(super-pipelining)技术,通过增加流水线级数来使更多的指令同时在流水线中重叠执行。
另一种是多发射流水线(multiple issue pipelinging)技术,通过同时启动多条指令(如整数运算、浮点运算、存储器访问等)独立运算来提高指令并行性。

八、异常和中断

1.中断和异常的基本概念

在早期的Intel 8086/8088微处理器中,并不区分异常和中断,两者统称为中断,
由CPU内部产生的意外事件称为“内中断”,
通过CPU的中断请求引脚INTR和NMI从CPU外部发出的中断请求为“外中断”。
从80286开始,Intel统一把“内中断”称为异常,而把“外中断”称为中断。
在IA-32架构说明文档中,Intel对异常和中断进行了如下描述:
处理器提供了异常和中断这 两种打断程序正常执行的机制。
中断是一种典型地由I/O设备触发的、与当前正在执行的指令无关的异步事件;
而异常是处理器执行一条指令时,由处理器在其内部检测到的、与正在执行的指令相关的同步事件。
有时为了强调异常是CPU内部执行指令时发生,而中断是CPU外部的I/O设备向CPU发出的请求,特称异常为“内部异常”,而中断为“外部中断”。
异常和中断两者的处理过程和实现机制基本上是相同的,这就是为什么有些体系结构或教科书中将两者统称为“中断”或统称为“异常”的原因。
异常和中断处理的大致过程如下:

异常和中断处理的过程.png

2.异常的分类

Intel将内部异常分为三类:

  • 故障(fault)
  • 陷阱(trap)
  • 终止(abort)

1.故障
故障是在引起故障的指令被启动后但未执行结束时CPU检测到的一类与指令执行相关的意外事件。
这种意外事件有些可以恢复,有些则不能恢复。
①对于像溢出和非法操作码等这类故障,因为无法通过异常处理程序恢复,因此不能回到被中断的程序继续执行,通常异常处理程序在屏幕上显示一个对话款告知发生了某种故障,然后调用内核中的abort例程,以终止发生故障的当前进程。
②对于除数位0的情况,根据是定点除法指令还是浮点除法指令有不同的处理方式。对于浮点数除0,异常处理程序可以选择将指令执行结果用特殊的值(如∞或NaN)表示,然后返回到用户进程,继续执行除法指令后面的一条指令;对于整数除0,则会发生“整数除0”故障,通常用abort例程来终止当前用户进程。
③对于页故障(page fault),对应的页故障处理程序会根据不同的情况进行不同的处理。如果检测到缺页或地址越界或者访问越权,都会产生页故障,从而调出内核中相应的异常处理程序执行。因此,CPU产生的“page fault”异常中包含了多种不同情况,需要页故障处理程序根据具体情况进行不同处理:首先检测是否发生地址越界或访问越权,如果是的话,则故障不可恢复;否则是真正的缺页故障,此时,可以通过从磁盘读入页面来恢复故障。

2.陷阱
陷阱也称为自陷或陷入,与“故障”等其他异常事件不同,是预先安排的一种“异常”事件,就像预先设定的“陷阱”一样。当执行到陷阱指令(也称为自陷指令)时,CPU就调出特定的程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令执行。

陷阱的重要作用之一是在用户程序和内核之间提供一个像过程一样的接口,这个接口称为系统调用,用户程序利用这个接口可以方便地使用操作系统内核提供的一些服务。操作系统给每个服务编一个号,称为系统调用号,每个服务功能通过一个对应的系统调用服务例程提供。例如,在Linux系统中提供了创建子进程(fork)、读文件(read)、加载并运行新程序(execve)等服务功能,系统调用fork、read和execve的调用号分别是1、3和11。
此外,利用陷阱机制还可以实现程序调试功能,包括设置断点和单步跟踪。

3.终止
如果在执行指令过程中发生了严重错误,例如,控制器出现问题,访问存储器发生校验错等,则程序将无法继续执行,只好调用abort例程,以终止发生问题的进程,在有些严重的情况下,甚至要重启系统。显然,这种异常是随机发生的,无法确定发生异常的是哪条指令。其中断是由外部I/O设备请求处理器进行处理的一种信号,它不是由当前执行的指令引起的。

3.中断的分类

外部I/O设备通过特定的中断请求信号线向CPU提出中断申请。CPU在执行指令的过程中,每执行完一条指令就查看中断请求引脚,如果中断请求引脚的信号有效,则进入中断响应周期。在中断响应周期中,CPU先将当前PC值(称为断点)和当前的机器状态保存到栈中,并设置成“关中断”状态,然后,从数据总线读取中断类型号,根据中断类型号跳转到对应的中断服务程序执行。中断响应过程由硬件完成,而中断服务程序执行具体的中断处理工作,中断处理完成后,再回到被打断程序的“断点”处继续执行。
Intel将外部中断分成

  • 可屏蔽中断
  • 不可屏蔽中断

1.可屏蔽中断
可屏蔽中断是指通过可屏蔽中断请求线INTR向CPU进行请求的中断,主要来自I/O设备的中断请求,CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,若一个I/O设备的中断请求被屏蔽,则它的中断请求信号将不会被送到CPU。

2.不可屏蔽中断
不可屏蔽中断通常是非常紧急的硬件故障,通过专门的不可屏蔽中断请求线NMI向CPU发出中断请求,如:电源掉电,硬件线路故障等,这类中断请求信号一旦产生,任何情况下它都不可以被屏蔽,因此一定会被送到CPU,以便让CPU快速处理这类紧急事件。通常,这种情况下,中断服务程序会尽快保存系统重要信息,然后在屏幕上显示相应的消息或直接重启系统。

4.异常和中断的响应

CPU对异常和中断的响应过程可分为以下三个步骤:

  • 保护断点和程序状态
  • 关中断
  • 识别异常和中断事件并转相应处理程序执行

1.保护断点和程序状态
对于不同的异常事件,其返回地址(即断点)不同。例如,
“缺页故障”异常的断点是发生故障的当前指令的地址;
“陷阱”异常的断点则是陷阱指令后面一条指令的地址。
断点与异常类型有关。
为了能在异常处理后正确返回到原被中断的程序继续执行,数据通路必须能正确计算断点处的地址。假定计算出的断点地址存放在PC中,则保护断点时,只要将PC送到堆栈或特定的寄存器中即可。
因为异常处理后可能还要回到原被中断的程序继续执行,所以,被中断的原程序的状态(如产生的各种标志信息、允许自陷标志等)都必须保存起来。通常每个正在运行程序的状态信息存放在一个专门的寄存器中,这个专门寄存器统称为程序状态寄存器(PSWR),存放在PSWR中的信息称为程序状态字(Program Status Word,简称PSW)。与断点一样,PSW也要被保存到栈或特定寄存器中,在异常返回时,将保存的PSW恢复到PSWR中。

2.关中断
设置一种机制来禁止在处理异常或中断时再响应新的异常或中断。通过设置“中断允许位”(“中断允许”触发器)来实现。当中断允许位置1,则为开中断,表示允许响应中断或异常;若中断允许位被清0,则为关中断,表示不允许响应中断或异常。

3.识别异常和中断事件并转相应的处理程序
内部异常事件的识别,只要CPU在执行指令时把检测到的事件对应的异常类型号或标识异常类型的信息记录到特定的内部寄存器中即可。
外部中断源的识别比较复杂。外部中断是随机的、与当前执行指令无关,因此对于外部中断,只能在每条指令执行完后、取下条指令之前去查询是否有中断请求。通常CPU通过采样对应的中断请求引脚有效,则说明有中断请求,但是,到底是哪个I/O设备发出的请求,还需要进一步识别。通常是由CPU外部的中断控制器根据I/O设备的中断请求和中断屏蔽情况,结合中断响应优先级,来识别当前请求的中断类型号,并通过数据总线将中断类型号送到CPU。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 中央处理器 CPU 是计算机的中央处理部件,具有指令控制,操作控制,时间控制,数据加工等基本功能。 早起的cpu有...
    莫那一鲁道阅读 831评论 0 0
  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,237评论 1 22
  • 阅读经典——《深入理解计算机系统》06 本文,我们要做一件大胆的事情,从零开始实现一个全新的指令集架构,以此深入理...
    金戈大王阅读 20,648评论 7 52
  • 情景模拟 有主机A,eth0的IP为内网IP:192.168.56.101,eth1为公网IP:120.77.36...
    VoidKing阅读 6,814评论 0 0
  • uuid 删除后在安装,每次值不一致uuid_2 删除后在安装,每次保持一致 注:1.NSUUIDMan...
    木子Charles阅读 502评论 0 5