组成原理(十一):机器(中)

16# 系列文章目录


文章目录


前言

哈工大网课笔记,教材是《计算机组成原理》(唐朔飞)


(二)CPU的结构和功能

1.CPU的结构

1.1.CPU的功能

要知道CPU的结构,先了解CPU需要提供什么功能,然后再了解什么样的结构可以实现这些功能。

  • 指令控制
  • 操作控制
  • 时间控制
  • 处理中断
  • 数据加工
1.1.1.控制器的功能
  • 取指令:把指令从内存中取出
  • 分析指令:对指令的操作码部分进行解码,分析这条指令要完成什么功能,是指令集当中的哪一条指令。
  • 执行指令:CPU的控制器发出各种操作命令,由这些操作命令控制相应的部件去完成指令要求的动作。(操作命令之间有顺序)
  • 控制程序的输入以及结果的输出
  • 总线的管理
  • 处理异常情况和特殊请求
1.1.2.运算器的功能
  • 实现算术运算和逻辑运算

1.2.CPU结构框图

1.2.1.CPU与系统总线

在这里插入图片描述

1.3.CPU的寄存器

不同的CPU、不同的指令集结构,对CPU的寄存器的设置的要求是不一样的,这里的讲解是抽象的讲解,主要介绍寄存器在各种类型的计算机当中的简单分类,这里的分类也不是完全正交的。

1.3.1.用户可见寄存器(非体系结构寄存器)
  • 通用寄存器
    存放操作数,如8086系统中的AX、BX…
    也可以做某种寻址方式所需要的专用寄存器。
  • 数据寄存器
    存放操作数,满足各种数据类型,如存储整型数据的寄存器、浮点数类型的寄存器…
    两个寄存器拼接存放双倍字长数据,例如在乘法操作时,就将ACC与MQ拼接在一起,保存相乘后的积。
  • 地址寄存器
    存放地址,其位数应满足最大的地址范围。如8086系统中的各种段寄存器。
    用于特殊的寻址方式,如段基址、栈指针。
  • 条件码寄存器
    存放条件码,可作程序分支依据。如正、负、零、溢出、进位等。
1.3.2.控制和状态寄存器
  • 控制寄存器
    P C → M A R → M → M D R → I R PC\rightarrow MAR\rightarrow M\rightarrow MDR\rightarrow IR PCMARMMDRIR
    这些寄存器都是控制CPU操作的,称为控制寄存器。
    其中MAR、MDR、IR是用户不可见的,PC是用户可见的,

所谓用户可见的,就是指用户在编写程序的过程当中,可以读到这些寄存器的值。

  • 状态寄存器
    反映指令执行结果的情况、计算机软件硬件状态。
    状态寄存器和条件码寄存器类似去,用于存放条件码
    PSW寄存器:程序状态字寄存器,用于存放程序状态字。

程序状态字:在中断或者是子程序调用过程当中,为了能够使程序正确的返回断点,返回断点后能够继续进行给定的程序,在中断或者转子程序之前,就要保存主程序的运行现场和程序断点,这些运行现场和断点包括了程序运行的软件信息和硬件信息,这些信息保存在寄存器当中,有些表示程序运行状态的寄存器可以通过指令集当中的指令进行读/写,有一些不能通过指令集中的指令进行读,因为涉及到的状态比较多,如果为每一个状态都设计一条指令来进行读,则指令集会变得非常庞大。
为了完成程序现场和程序断点的保存,就将这些软硬件状态相关的寄存器集合成一个大的寄存器,这个寄存器就是程序状态字,程序状态字比较长,有些程序状态字可以达到几千位。
可以通过交换程序状态字的方式,来完成程序现场的切换,使得程序中断当中,保存程序断点以及恢复程序断点比较容易。

1.4.控制单元CU和中断系统

1.4.1.CU(控制单元)

产生全部指令的微操作命令序列。任何一条指令,要在CPU上执行,CPU要对指令进行译码,根据这是什么样的指令,完成对应的功能,要产生完成这些功能需要的微操作命令,并且保证这些命令的顺序。

  • CU有两种设计方式
    组合逻辑设计,完全由组合逻辑硬件(硬连线逻辑)来实现,这种方式速度快,如RISC计算机控制器的实现都是采用硬连线逻辑。
    微程序设计,采用存储逻辑进行设计,设计简单,适用于复杂功能的指令的设计。
1.4.2.中断系统

参见 4.中断系统

1.5.ALU

参见组成原理:数字(下)

2.指令周期

2.1.指令周期的基本概念

2.1.1.指令周期

取出并执行一条指令所需的全部时间(解释一条指令需要的全部时间)
在这里插入图片描述

取指周期:把指令从内存中取出,放入IR,分析指令操作码和寻址方式。
执行周期:找到取出操作数后完成指令要求的全部运算。

说明:在这里将完成一条指令分成取指周期和执行周期,这种分法只是教材上给出的一个例子,不同的CPU、不同的指令集、不同的设计方法,可以把完成一条指令分成不同的阶段,所以要注意,这里仅仅是一个例子。

2.1.2.每条指令的指令周期不同

实际上,即使在一个CPU当中,不同的指令,指令周期的长度或者说指令周期里包含的机器周期的个数也可能是不一样的。
在这里插入图片描述

2.1.3.具有间接寻址的指令周期

在这里插入图片描述
取指周期访问一次内存,将指令从存储单元当中取出,间址阶段访问一次内存,将操作数的地址从内存单元当中取出,执行阶段再次访问内存,真正的将操作数从内存取出然后进行相应的运算,并把结果保存在给定的寄存器当中。

2.1.4.具有中断周期的指令周期

如果机器是支持中断的,那么在指令周期的执行周期结束后,就要确认是否有中断请求,如果有中断请求,需要去响应中断,响应中断的过程需要保持断点,要形成中断服务程序的入口地址,要硬件关中断,这些操作都在中断周期完成。
在这里插入图片描述

2.1.5.指令周期流程

在这里插入图片描述

2.1.6.CPU工作周期的标志

指令周期的不同阶段,控制器需要发出不同的控制命令,所以控制器需要知道当前处于指令周期哪一个阶段,以便于控制器发出相应的控制操作,即使是对同一个部件进行操作,在指令周期的不同阶段,这些操作可能也是不同的。
CPU访存有四种性质:
在这里插入图片描述

2.2.指令周期的数据流

2.2.1.取指周期数据流

在这里插入图片描述
从PC开始,PC知道要取的指令所在的内存单元的地址,需要把这个地址传给存储器。PC先将地址传给MAR,MAR将地址送到地址总线上,通过地址总线将地址送给存储器。
存储器知道地址后,由CU控制完成读操作,CU将控制信号送到控制总线上,通过控制总线送给存储器,存储器执行端操作,将响应的数据送到数据总线上,通过数据总线送到MDR,此时指令已经被取到CPU,保存在MDR中,然后将指令送到IR当中,最后,如果没有跳转的的话,CU控制PC+1,指向下一条指令。

2.2.2.间址周期数据流

在这里插入图片描述
间址周期说明这条指令是间接寻址,操作数的地址保存在指令的地址码当中,由于指令先到MDR,再送到IR,所以MDR和IR中都保存了指令,这里假设起始操作从MDR开始, 将MDR中的地址码部分送到MAR当中,这里是要再次进行内存单元的访问,取出这条指令要的操作数的地址。
地址(操作数地址的地址)送到存储器后,CU控制存储器读取数据(操作数的地址),再通过数据总线传给MDR。

2.2.3.执行周期数据流

不同指令的执行周期的执行数据流不同。

2.2.4.中断周期数据流

在这里插入图片描述
在中断周期的操作:

  • 保存断点(PC入栈)
    把程序断点保存在某一个内存单元中,由CU控制程序断点保存在哪个地址的内存单元中,所以由CU给出地址,放到MAR当中,通过地址总线传给存储器,CU通过控制总线将写命令传给存储器,此时要保存的断点,即程序回来后的下一条指令的位置,也就是PC的值,所以将PC将这个值送到MDR,通过数据总线送到存储器,由存储器将数据写入到CU给出的地址当中。
  • 形成中断服务程序的入口地址(中断向量进PC)
    CU将中断服务程序入口地址传给PC,PC跳转执行中断服务程序。
  • 硬件关中断

3.指令流水

3.1.如何提高机器速度

流水线技术是现代处理器当中最常用的也是最有效的一种提高指令解释速度的方法,从结构、功能比较简单的嵌入式处理器到功能复杂,规模庞大的高性能处理器,都使用了流水线技术。

3.1.1.提高访存速度
  • 使用高性能芯片
  • 设置各级cache
  • 使用多体并行:对多个存储体进行交叉访问,在一个存储周期当中,有多个存储体可以向CPU提供数据(CPU可以向同时取得多个存储体数据)。
3.1.2.提高I/O与主机之间的传送速度
  • 程序查询方式 → \rightarrow 程序中断方式 → \rightarrow DMA → \rightarrow 通道 → \rightarrow I/O处理机

CPU与外设的信息传输的控制方式,从CPU与外设串行工作(查询查询方式)到CPU、外设部分并行工作(程序中断方式)再到进一步将CPU从输入输出中解放出来(DMA、通道),逐渐提高CPU使用率。后来对DMA功能进行加强,采用了更强的通道和I/O处理机的方式。在I/O处理机模式下,内存和外设之间进行数据传送,整个数据传送过程包括数据校验全部由I/O处理机完成,完全脱离了CPU的参与。

  • 使用多总线方式进行传送
3.1.3.提高运算器的速度
  • 使用高性能芯片
  • 改进算法
  • 快速进位链

为了提高整机处理能力,除了上面的方法,还可以改进系统体系结构,开发系统的并行性。

3.2.系统的并行性

3.2.1并行的概念

在这里插入图片描述

并发一般是指时间片流转这种形式,用快速切换执行的方式使多个任务看起来是同时执行,实际上任意时刻只有一个任务在执行。

3.2.2.并行性的等级

在这里插入图片描述

指令级的并行也被称为ILP,指两条或多条指令之间,在同一时刻都处于被解释的状态,也可以是指令内部的操作、微操作之间并行的操作。

3.3.指令流水原理

3.3.1.指令的串行执行

在这里插入图片描述

3.3.2.指令的二级流水

在这里插入图片描述

这里是指在理想条件下,使用二级流水,流水线满负荷运作的情况下可以提速一倍,但是并不是所有流水线都是理想流水线,并且指令之间也存在一定的相关性,所以流水线一直处于满负载是非常难的。

3.3.3.影响指令流水效率加倍的因素
  • 执行时间 > 取指时间
    当指令比较复杂,涉及的操作比较多,执行时间会比较长,而取指相对时间固定,因此执行时间会大于取指时间。
    在这里插入图片描述

为了解决执行时间 > 取指时间的问题,在取指部件和执行部件之间加入缓冲区,用于缓存取指部件取回的指令,取指部件如果运行较快,就将指令放入缓存区,执行部件执行完一条指令后,从缓存区拿取下一条指令执行。

  • 条件转移指令对指令流水的影响
    无条件转移对流水线效率影响较小,在译码阶段就能够知道这是一条转移指令,并且能够知道跳转的地址,而对于条件转移指令则大不一样,只有当这条指令执行阶段结束有了执行结果,才能知道转移条件是否成立,才能确定下一条指令的真正地址。造成较大的时间损失。

解决办法:分支预测,自己查资料。

3.3.4.指令的六级流水

在这里插入图片描述

横轴表示时间,纵轴表示指令
FI: 取指令
DI:指令译码
CO:形成操作数的地址
FO:取操作数
EI:执行
WO:结果写回

设有n条指令,每条指令采用k级流水,最后需要m个时间单位 m = ( k × n ) + 2 ( k − 1 ) ! k m= \frac{(k\times n)+2(k-1)!}{k} m=k(k×n)+2(k1)!

3.4.影响指令流水线性能的因素

3.4.1.结构相关

不同指令争用同一功能部件产生资源冲突。

比如说一条指令要用运算器来计算下一条指令的地址,另外一条指令在同一时钟周期要用运算器完成指令指定的运算,此时两条指令就会发生资源冲突。

在这里插入图片描述

在第四个时间周期中,第一条指令取操作数,要对内存进行访问,与此同时第四条指令需要取指令,也需要对内存进行访问,此时就出现了资源冲突。
在第五个时间周期,第二条指令与第五台条指令冲突…
在第六个时间周期,第一条、第三条、第六条指令冲突…

解决办法:

  • 停顿(加入气泡)
    例如在第四个时间周期中,第一条指令取操作数,要对内存进行访问,与此同时第四条指令需要取指令,也需要对内存进行访问,这时候就要第四条指令的取指令操作向后延迟一个或多个时间周期,也就是让其“停顿”一下。
  • 指令存储器和数据存储器分开
    将指令存储器和数据存储器分开,存取指令时在指令存储器中进行访存,存取数据时对数据存储器进行访存。

现代计算机当中,将指令cache和数据cache分开就是为了解决冲突问题。

  • 指令预取技术(适用于访存周期短的情况)
    如果对内存的访问比较快,存取周期比较短,则取指部件可以利用空闲时间把多条指令从内存当中取出,放入CPU的指令缓冲队列等待执行,这样也可以减少对内存资源进行访问时产生资源冲突。
3.4.2.数据相关

不同指令因重叠操作,可能改变操作数的读/写访问顺序。
流水线分为多个段,可能有多个读段和多个写段。通常情况下前段是读操作,后段是写操作,就可能会改变操作数的读写顺序,产生数据相关。通俗地说,就是一个寄存器或者内存存储单元,本来应该先写后读,但是写是需要时间的,比如说写之前要先计算结果,然后结果还没出现呢,另一个指令就直接读走了结果

  • 写后读相关(RAW)
    对某一个存储单元或是某一个寄存器先完成写操作,再做读操作。
    在这里插入图片描述
  • 读后写相关(WAR)
    对某一个存储单元或是某一个寄存器先完成读操作,再做写操作。
    在这里插入图片描述
  • 写后写相关(WAW)
    要保障对某一个存储器件进行写入的时候先写后写的时间顺序,这个时间顺序由程序来规定。
    在这里插入图片描述

不管用什么样的并行技术去执行程序,都要保障这个程序的执行结果和程序串行的结果是完全相同的

解决办法:

  • 后推法
    类似停顿,后面的指令等待前面相关的指令完成后再执行

  • 旁路技术(相关专用通路、前向通道)
    对之前的指令有相关的数据,不需要等待其被存储,结果一旦在运算器中生成,直接当成操作数输入到第二条指令当中,更好节约时间。

3.4.3.控制相关

由转移指令引起
在这里插入图片描述

在这里插入图片描述

如上图,指令3是转移指令,在指令3的执行阶段EI完成之前,无法确定这条指令后是跳转还是顺序执行,假设这里指令3EI完成后下一条会转移到指令15,但是在EI确定转移条件成立时,指令4已经解释到取操作数阶段,指令5已经执行的生成操作数地址阶段,以此类推,指令7已经进入流水线开始取指,但是由于下一条执行的是指令15,所以指令4到指令7已经进入流水线开始解释的部分全部要作废,这就是转移造成的损失。

3.5.流水线性能

3.5.1.吞吐率 T p T_p Tp

单位时间内流水线所完成的指令或者输出结果的数量。

  • 最大吞吐率
    流水线满负荷运转,没有各种阻碍流水线性能因素的影响(结构相关、数据相关、转移等)所能达到的最大的吞吐率是多少,即流水线在连续流动达到稳定状态后所获得的吞吐率。对于m段指令流水线,若其各段时间均为 δ t \delta t δt,则最大吞吐率为 T p m a x = 1 δ t T_{pmax} = \frac{1}{\delta t} Tpmax=δt1

实际上由于流水线在开始时有一段建立时间、结束时有一段排空时间以及各种相关因素使流水线无法连续流动,所以实际吞吐率总是小于最大吞吐率。

  • 实际吞吐率
    流水线满负荷运转,一段时间内,完成的指令条数除以完成这些指令花费的时间。 T p = n m ⋅ δ t + ( n − 1 ) ⋅ δ t = 1 δ t ⋅ [ 1 + m − 1 n ] = T p a m x 1 + m − 1 n T_p ={ \frac{n}{m\cdot \delta t + (n-1)\cdot \delta t }= {\frac{1}{\delta t \cdot[1+\frac{m-1}{n}]}}} = {\frac{T_{pamx}}{1+\frac{m-1}{n}}} Tp=mδt+(n1)δtn=δt[1+nm1]1=1+nm1Tpamx

可以看到 lim ⁡ ( n − m ) → ∞ T p = lim ⁡ ( n − m ) → ∞ n m ⋅ δ t + ( n − 1 ) ⋅ δ t = T p m a x \lim_{(n-m)\to\infty} T_p = \lim_{(n-m)\to\infty} \frac{n}{m\cdot \delta t + (n-1)\cdot \delta t } = T_{pmax} (nm)limTp=(nm)limmδt+(n1)δtn=Tpmax只有当指令规模够大时,实际吞吐率才会近似最大吞吐率。
最直接的方法就是计算某一段时间内执行了多少条指令

3.5.2.加速比 S p S_p Sp

m段流水线采用流水线技术和不采用流水线技术两种方法速度的比值,用来衡量流水线的效果。
完成n条指令在m段流水线上共需 T = m ⋅ δ t + ( n − 1 ) ⋅ δ t T = m\cdot \delta t + (n-1)\cdot \delta t T=mδt+(n1)δt完成n条指令在等效的非流水线上共需 T ′ = n ⋅ m ⋅ δ t T' = n\cdot m\cdot \delta t T=nmδt S p = n ⋅ m ⋅ δ t m ⋅ δ t + ( n − 1 ) ⋅ δ t = n ⋅ m n + m − 1 = m 1 + m − 1 n S_p = {\frac{ n\cdot m\cdot \delta t}{m\cdot \delta t + (n-1)\cdot \delta t}} = {\frac{n\cdot m}{n+m-1}}={\frac{m}{1+\frac{m-1}{n}}} Sp=mδt+(n1)δtnmδt=n+m1nm=1+nm1m

如果不是理想流水线,加速比就是两个时间的比值。 lim ⁡ ( n − m ) → ∞ S p = lim ⁡ ( n − m ) → ∞ n ⋅ m ⋅ δ t m ⋅ δ t + ( n − 1 ) ⋅ δ t = m \lim_{(n-m)\to\infty} S_p = \lim_{(n-m)\to\infty}{\frac{ n\cdot m\cdot \delta t}{m\cdot \delta t + (n-1)\cdot \delta t}} = m (nm)limSp=(nm)limmδt+(n1)δtnmδt=m即当流水线各段时间相等时,其最大加速比等于流水线的段数。

3.5.3.效率E

流水线中各功能段的利用率(硬件的利用率)
即使是流水线满负荷运转,由于流水线有建立时间和排空时间,各功能段的设备也不可能一直处于工作状态。
在这里插入图片描述
效率就是流水线各段处于工作时间的时空图除以流水线中各段总的时空图。 E = n ⋅ m ⋅ δ t m ⋅ ( m + n − 1 ) ⋅ δ t = n m + n − 1 = S p m = T p ⋅ δ t E = {\frac{n\cdot m\cdot \delta t}{m\cdot (m+n-1)\cdot \delta t}} ={\frac{n}{m+n-1}}={\frac{S_p}{m}}={T_p\cdot \delta t} E=m(m+n1)δtnmδt=m+n1n=mSp=Tpδt
在这里插入图片描述

3.6.流水线的多发技术

3.6.1.超标量技术

每个时钟周期内可并发多条独立指令,使用多条流水线,配置多个部件,同一时刻多条指令进入不同的流水线,不能调整指令的执行顺序,通过编译优化技术,将可并行执行的指令搭配起来。

在这里插入图片描述

3.6.2.超流水线技术

将一些流水线寄存器插入到流水线段中,好比把一个时钟周期(一个流水段)进行进一步的细分,然后在原来的一个时钟周期内,一个功能部件使用多次。也不能调整指令执行的顺序,通过编译程序解决优化问题。
在这里插入图片描述

注意,超流水线技术和将流水段分得很细是有区别的,在普通流水线的设计当中,流水段之间要设置锁存器,来存储上一个流水段的结果作为下一个流水段进行的操作信号、控制信号和操作的数据,在超流水线技术中,流水段之间还是设有锁存器,但是在一个时钟周期内(一个流水段内)再次细分的多份流水间是没有锁存器的,所以超流水技术一个关键的技术就是不同指令处在同一流水段内,相互之间的信号不能叠加。意思就是第一个指令在一个时钟段的第一块得到的结果,第二个指令不能在这个时钟段的第二块使用,只有到第二个时钟段,第一个指令的结果到了锁存器,第二个指令才能使用。

3.6.3.超长指令字技术

在数字信号处理,多媒体信号处理中,用的非常广泛,由编译程序挖掘出指令间潜在的并行性(根据计算机当中执行部件的种类和数量来决定),将多条能并行操作的指令组合成 一条具有多个操作码字段的超长指令字(可达几百位,包括多个操作码字段,多个操作数字段),这条指令被从计算机的内存中取出,多个操作码字段进行译码,多个并行的部件分别执行相应的操作。
减少了取指时间,因为每次取出多条指令
在这里插入图片描述

灰色的部分是执行时间,执行部件有多个
取值阶段一次取一条超长指令字,然后译码阶段也是CU进行译码
在执行阶段,CU控制多个执行单元并行工作,因为编译程序已经认为这些指令是可以并行的,意思就是执行的时候不会冲突,比如说一个进行加减法,一个进行存取数等

3.7.流水线的结构

3.7.1.指令流水线结构

完成一条指令分 6 段(实际上对不同结构的指令和机器是不一样的,这里是以6段为例), 每段需一个时钟周期
在这里插入图片描述

  • 若流水线不出现断流(也就是不产生资源、数据、控制冲突,并且指令条数足够,能够连续输入到流水线中) 1 个时钟周期出 1个结果(这个结果是一个指令的结果,不是一个指令在一个时钟周期的结果),如果断流的话,要考虑建立时间和排空时间。
  • 不采用流水技术,6 个时钟周期出 1个 结果

理想情况下,6 级流水 的速度是不采用流水技术的6 倍
实际上,流水段之间会加上锁存器,这个锁存器用于保存前面流水段的操作结果,同时为下一段提供操作数据和操作信号
指令1在第一个流水段的结果被存到锁存器之后,指令2也可以使用这个结果。

3.7.2.运算流水线

流水线不仅仅用于指令,像运算也能使用流水线技术以提高速度,比如说浮点数运算,就很复杂,完成浮点加减运算可分对阶、尾数求和、规格化三段
在这里插入图片描述

分段原则时间尽可能一致,如果不等,那么时钟周期就要按照最长的那一段来,这样会降低整个流水线的速度

4.中断系统

4.1.概述

4.1.1.引发中断的因素
  • 人为设置的中断
    如转管指令,在程序当中编入转管指令,利用转管指令去访问管理程序(操作系统当中的程序),来帮助我们实现程序当中的一些功能,也就是操作系统中的系统调用。
    在这里插入图片描述
  • 程序性事故
    在程序运行过程当中,或者是指令的执行过程当中,发生了运算的的溢出、操作码不能识别、非法的除法等也会引发中断。
  • 硬件故障
    比如说存储器故障、硬盘当中出现坏道、电源掉电等
  • I/O设备
    进行输入输出也要使用中断
  • 外部事件
    用键盘中断现行程序
4.1.2.中断系统需解决的问题(功能)
  • 各中断源如何向CPU提出中断请求
  • 有多个中断源同时提出请求怎么办
  • 有中断源提出中断请求,CPU什么条件、什么时间、以什么方式响应中断
  • 如何保护断点、现场
  • 如何寻找中断服务程序入口地址
  • 如何恢复现场、断点
  • 如果在处理中断的过程当中又出现了新的中断怎么办

用软件+硬件的方式来实现中断系统需要的功能

不同的计算机对中断系统的软硬件功能的划分是不一样的主要依据于要设计的中断系统的速度、设计的复杂度和设计的灵活性这三个方面考量折中。

4.2.中断请求标记和中断判优逻辑

4.2.1.中断请求标记

为了让中断源能够向CPU提出中断请求,给每一个中断源设计一个触发器INTR,用这个触发器来标记这个中断源是否提出了中断请求,每一个中断源对应都一个中断请求标志触发器,多个中断源对应的多个中断请求标志触发器从逻辑上组成中断请求标志寄存器。
中断请求标志触发器可以放在各个中断源放在各个中断源的接口电路中,物理电路上是分散结构的,从逻辑上组成一个中断请求标志寄存器。也可以将其集中在CPU当中,做在CPU的中断系统内。
在这里插入图片描述

4.2.2.中断判优逻辑

如果有多个中断源同时提出中断请求,需要响应最重要的那个,所以要把中断源根据重要性进行分级,即中断源的优先级。用中断判优逻辑来确定在现有的的中断请求源当中哪个优先级最高,就响应哪个中断。

  • 硬件实现(排队器)
    在这里插入图片描述
    如图,高优先级的中断请求信号会将低优先级中断请求信号清零(我觉得叫覆盖更合理一点),最终排队器对应的输出只有一位是1,其余都是0。

这里低优先级的中断信号被高优先级中断请求信号置零后并没有消失,其INTR仍然置为1,排在队列中,当它之前的高优先级的中断被处理完后,它成为优先级最高的中断信号,就会开始处理这个中断,所以这里我觉得用覆盖的说法更好

在设计计算机的时候,就要对中断源的优先级进行划分,然后设计排队器对中断源进行排队,以响应优先级最高的中断源的中断请求信号。

在现代计算机当中,大部分CPU都是用硬件来实现中断判优逻辑

  • 软件实现(程序查询)

在这里插入图片描述

4.3.中断服务程序入口地址的寻找

1.硬件向量法
用硬件的方式形成中断向量地址
由排队器确定要响应的优先级最高的中断请求作为输入传入向量地址形成部件,由向量地址形成部件来找到对应的中断服务程序入口地址的地址。在这里插入图片描述
中断服务程序的入口地址有两种办法给出,
一种是在中断向量地址的那个存储单元中存放一条跳转指令,这条跳转指令当中包含了中断服务程序的入口地址。
第二种是给出向量地址后,内存单元当中指定的位置保存的就是中断服务程序入口地址。
在这里插入图片描述

硬件实现速度快,但是设计的灵活性比较低。

2.软件查询法
用软件如何实现寻找中断服务程序的入口地址呢?
假设八个中断源 1,2,… 8 按 降序 排列,通过执行中断识别程序进行查找
假设中断识别程序的入口地址是M,程序的指令和说明如下
在这里插入图片描述
SKP的含义是跳过下一条指令
SKP DZ 1 的意思是查询第一号中断源的完成触发器D

  • 如果D = 1,说明中断源已经准备好了,跳转到1的中断服务程序
  • 如果D = 0,跳过下一条程序,查询第二号中断源

软件的方法显然更加灵活,如果想改变中断服务的优先级,就改变中断识别程序的顺序即可

4.4.中断响应

CPU 什么条件、什么时间、以什么方式响应中断 ?

4.4.1.响应中断的条件

并不是中断源提出中断服务请求CPU就要立即响应
例如CPU只能支持单重中断

单重中断:CPU在相应某一个中断源的中断请求,并且开始执行中断服务程序的情况下,即使有新的中断请求,CPU也不能响应

为了表示CPU是否允许响应中断请求,CPU内部有一个EINT允许中断触发器,只有EINT = 1的时候,才会响应中断请求。

4.4.2.响应中断的时间

不是任何时间(比如说指令的执行过程中)都可以响应的
一般的机器CPU只有在指令执行阶段结束以后才能响应中断请求。
有些计算机某些指令比较复杂,执行时间可能比较长,为了能够及时处理异常事件,允许CPU在执行指令的过程中进行中断响应。通常情况下在指令执行结束之后

思考:为什么在指令执行结束之后响应中断?
在指令执行时中断,破坏执行状态,需要保存的现场数据更多,而且恢复现场后还需要重新执行指令,浪费之前指令的执行时间。

指令执行周期结束时刻由CPU 发查询信号,这个查询信号送到每一个中断源当中的中断请求触发器,查询信号会驱动中断请求触发器将触发器输出端置1,然后发送到排队电路
在这里插入图片描述

4.4.3.中断隐指令

如果需要响应某个中断请求,CPU如何响应中断请求?

  • 保护程序断点
    程序断点就是中断服务程序结束之后,返回的源程序要执行指令的地址,就是一个地址。
    有两种办法保护断点:
    断点存于特定地址(比如0号地址)内,这个地址是内存的一块存储单元
    断点进栈,返回的时候出栈即可

  • 形成服务程序入口地址
    有两种办法形成服务程序入口地址:
    向量地址——>PC(硬件向量法),PC指向的存储单元中保存了入口地址,或者跳转指令
    中断识别程序 入口地址 M —> PC(软件查询法)

  • 硬件关中断
    关中断是为了避免在单重中断的计算机中,在执行中断服务程序的过程中,有新的中断源发出中断请求,打断当前中断服务程序的执行。
    即使在多重中断中 也要在 保护程序断点和现场的时候关中断,会在中断程序内再打开。
    关中断就是将EINT置为0
    在这里插入图片描述

EINT输出为1,传入到INT下面的与非门中。
如果有中断请求,排队器的输出有且仅有一个1,使用一个或门,输出1就表示是有请求,也加入到与非门中。
当EINT = 1且有请求的时候, INT = 1,表示有中断请求,并且INT的1送回到EINT,此时EINT置为0,表示不能接受中断。
排队器的输出会送到向量地址形成部件 形成 中断服务程序的入口地址送到PC中。

隐指令是指上面的三个步骤是由硬件自动执行的,并不是计算机指令集中的某个指令控制执行的,但是在执行响应中断的时候,这些硬件操作都要进行。
这里要补一个S-R触发器的原理

4.5.保护现场和恢复现场

4.5.1.保护现场

保护现场分为两点
在这里插入图片描述

在执行中断服务程序的时候,也需要使用寄存器但是寄存器数量有限,可能使用的寄存器在主程序中已经使用,在返回主程序后,仍然需要原来寄存器保存的内容,因此要将寄存器的内容先存起来,中断服务程序结束之后再恢复,这个由中断服务程序完成。

4.5.2.恢复现场

也是由中断服务程序完成,在结束的时候完成
在这里插入图片描述

4.6.多重中断

如果在执行中断服务程序的过程中,出现了更重要的,需要及时处理的新事件,怎么办呢?

4.6.1.多重中断的概念:

CPU在执行中断服务程序的过程中,有新的中断源提出请求并且新的中断请求的优先级大于当前请求,就要进行响应
在这里插入图片描述

4.6.2.实现多重中断的条件
  • 要允许CPU在执行某个中断服务程序时,响应新的中断请求,即提前设置开中断指令EINT
  • 只有优先级别高的中断源有权中断优先级别低的中断源
    在这里插入图片描述

由于D 的优先级较低,在执行C的时候不会执行D,C执行结束之后才执行D。
A的优先级较高,在执行D的时候跳到A执行,然后再返回D执行。
所有中断服务程序结束之后,返回主程序。

4.6.3.(中断)屏蔽技术

在之前已经学过了中断屏蔽技术,使用屏蔽技术,通过设置中断屏蔽字,来改变优先级,从而提高系统设计和响应的灵活性。中断屏蔽字就分散保存在中断屏蔽触发器中(硬件保存)。所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容即中断屏蔽字。

中断屏蔽触发器的作用

在这里插入图片描述
当排队器集中在CPU内部或者某个集中的部分,可以使用屏蔽触发器来排队,就是将排队器与中断屏蔽触发器结合使用。
M A S K i MASK_i MASKi组成了中断屏蔽字,如果MASKi = 1,表示对应的中断服务请求无法提出。

什么时候INTR的输出为1?
D的输出为1,MASK为0,此时Q非的输出为1,两个输出经过与非门和非门,只有两个都为1,也就是D输出为1,MASK值为0的时候,INTR的D口输入才为1,此时如果CPU发来查询之后,INTR就为1。
对于屏蔽触发器,只有当MASK = 0的时候,INTR才能被置1
总的来说,屏蔽触发器就是让某个中断源无法向CPU提出请求,也不能参加中断请求的排队。
屏蔽字只控制某个中断源能否发出请求或者发出的请求能否进行排队,但是如果两个中断源的请求都参与到排队,说明这两个的优先级都大于当前的优先级,都可以插入到当前的中断服务程序。但是具体是哪个插入呢?这就是根据原始排队器对这两个排队了,这就是响应顺序,由排队器的硬件结构决定,无法更改

屏蔽字

16个中断源 1、2、3…16 按降序排列,每一个中断源都对应一个屏蔽字,每一个屏蔽字表示当这个中断源的中断服务程序在执行的过程当中,是否允许哪一个个中断源提出的中断服务请求。
屏蔽字中“1”越多,优先级越高,每个屏蔽字中至少有一个1,这个1是屏蔽自身的中断。
在这里插入图片描述

屏蔽技术可改变处理优先等级

中断的优先级分为响应优先级和处理优先级:
响应优先级:中断响应优先级是针对同时到达的中断请求先处理谁的规定。比如A、B同时向CPU发出中断请求,而中断响应优先级是A>B,那么CPU就会先处理A,再处理B。不能改变,这是由硬件电路决定的。
处理优先级:中断处理优先级是解决中断嵌套情况下优先处理谁的问题。比如A、B两个中断的中断处理优先级是B>A,如果当CPU正在处理中断请求A时,B向CPU发送了中断请求,那么CPU会先暂停处理A,转而处理B,B结束后再继续处理A。可改变,通过设置中断屏蔽字,让一些响应高优先级的中断源的请求不能参与排队来重新设置处理优先级。

在这里插入图片描述
ABCD同时请求中断:这个时候还是主程序执行,屏蔽字为0000,此时使用原始的排队器得到A的优先级最高。
在这里插入图片描述
原屏蔽字中,A程序执行的时候,设置屏蔽字为1111,这样BCD都无法插入了,同理,当A执行完后返回主程序,再次响应B程序,B的屏蔽字为0111,只有A程序没有被屏蔽,所以即使CD有中断信号,但是无法进入排队器。以此类推,所以按照原屏蔽字的处理顺序顺序就是A→B→C→D。

在这里插入图片描述
新屏蔽字中,A处理时也设置屏蔽字为1111,这样BCD都无法插入,但是当A执行完后返回主程序,再次响应B程序,B的屏蔽字为0100,除了B自己被屏蔽,A、C、D都可以发出中断,此时C、D发出中断,由排队器排队,C优先响应执行C,C的屏蔽字为0110,所以A、D可以发出中断,此时D发出中断,响应D的中断,执行D程序,再一层层返回执行。所以按照新屏蔽字的处理顺序顺序就是A→D→C→B。

屏蔽技术的其他作用

可以人为地屏蔽某个中断源的请求

新屏蔽字的设置位置

在这里插入图片描述

4.6.4.多重中断的断点保护

断点可以保存到两种地方

  • 断点进栈。
  • 断点存入“0”地址,此处的0打引号,并不是真正的物理地址的0地址,而是指定的一个地址

这两个都是由中断隐指令完成

在中断周期(也就是解释指令周期的最后一个阶段),要做以下工作

  • 保存断点 0 → MAR(假设保存到到0地址,将0送到MAR)
  • 命令存储器写
  • PC → MDR;PC中保存着断点,将断点给MDR
  • (MDR) → 存储存储器

在多重中断中,存在问题:三次中断,三个断点都存入 “ 0 ” 地址,后面的断点会覆盖到原来的断点,如何保证断点不丢失?
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值