计算机组成原理(三)

C、中断设备向量地址形成部件

  • 在排队器处理完毕之后,所有的INTER线(仅有一条是低电平)经过设备向量地址形成部件后,设备向量地址形成部件给出中断响应程序首地址,CPU在收到中断指令后,根据提供的中断程序首地址从主存中取出指令,进行执行,下图是主存和向量地址在主存中的位置:

计算机组成原理(三)_第1张图片

D、综上我们可以给出一个中断响应方式I/O的接口较完整的结构

计算机组成原理(三)_第2张图片

地址线经过设备选择电路发出设备选择信号----> 启动命令经过命令译码器后令D(完成触发器)为0,B(状态触发器)为1----> B向设备发出启动命令,设备开始启动 --->设备工作结束返回数据到DBR,同时改变B和D为0和1--->  D为1后,和MASK(屏蔽触发器)一起经过与非门和非门,将电流输送到INTR----> 多个INTR(同时工作)经过排队器排队后,输送到设备编码器--->设备编码器,给出中断程序首地址---> CPU收到中断指令之后开始执行中断程序。

(四)I/O 中断处理过程

A、EINT(允许中断触发器)

默认EINT为0,不允许执行中断程序,当CPU查询到有中断指令且优先级高于现执行程序,则将EINT调为1,开始执行中断程序,执行完毕后调用指令恢复,或者物理硬件反弹。

B、中断执行的时间点

在一条指令执行阶段结束前,CPU会检测是否有中断指令,如果有就开始执行中断程序

十三、中断服务程序的流程

 (一)流程概览

A、执行保护程序,在中断之前,保存程序执行断点(依靠隐指令执行,隐指令就是硬件自动调用,程序无法调用),同时将程序需要用到的寄存器中的值保存起来,等待中断程序执行完毕之后,原程序恢复执行

这里保存原程序数据的方法有很多种,包括使用入栈指令将数据压入保护程序、或者将数据保存到其他暂时空闲的寄存器,或者保存到主存之中

B、中断服务,执行中断服务指令(不同I/O接口会有不同的中断服务)

C、执行中断服务完毕后,执行出栈指令,恢复原程序数据。

D、执行中断返回指令,继续执行原程序

 (二)单重中断和多重中断

A、单重中断:当有中断程序正在执行时,如果有优先级更高的中断请求,仍然执行本中断程序。

B、多重中断:当有中断程序正在执行时,如果有优先级更高的中断请求,允许程序被中断后执行新的中断程序。

C、两重中断的区别:

  • 在红框框起来的位置我们看到单重中断是在设备服务完成后,才打开中断允许(开中断),然后中断返回,而多重中断是在进入中断服务后,保护完现场(将寄存器中需要的数据存入其他位置)直接打开中断允许,允许其他中断请求继续中断

(三)总揽优劣

宏观上看,I/O接口和CPU是并行工作的,主要体现在(I/O接口在启动外部设备时,CPU仍然在运行主程序

从微观上看,当外部设备准备完成后,还是要通过中断指令占用CPU,主进程还是要被搁置,故又是串行化的,还显劣势。

十四、DMA方式(直接存储器访问)

(一)DMA方式和程序中断、查询方式的数据通路的不同

DMA方式将CPU从外部设备和主存的数据交换中解脱出来。从前面我们可以知道,程序查询方式和程序中断方式都必须要用CPU一个寄存器作为媒介,传递数据,这样CPU就参与到外部设备和主存的数据交换中,严重浪费CPU的性能。

计算机组成原理(三)_第3张图片

  • 从图中可以看出DMA方式可以直接将外部设备和主存构成通路,实现内外数据的直接传递,解放了CPU这一宝贵资源。

(二)DMA与主存交换数据的三种方式

A、方式一:直接占用主存和总线使用权

这种方式虽然简单,但是有很大弊端。当DMA占用主存后,CPU因为失去主存占有权,就处于不工作状态或保持状态(指令缓冲区中有指令但无法从主存中获取想要的数据),DMA占用主存后,因为数据的传输不是一次传输完成的,而是要一次一次传输,所以中间有很长时间,DMA方式是对主存的占用是处于空闲状态的,这严重浪费了CPU的性能。

计算机组成原理(三)_第4张图片

B、方式二:周期窃取(周期挪用)

这种方式是DMA在数据准备好后,发出总线占用请求,占用总线一个访存周期,数据传输完毕后,放弃总线使用权,还给CPU,这样就充分利用了总线和主存,减少了主存对CPU性能的消耗。

在DMA发出总线占用请求时会出现三种情况:1、总线闲置,直接占用 2、CPU正在占用主线,要等待CPU数据访存完毕。 3、CPU和DMA同时申请占用,则CPU要让出主线占用权(因为DMA通常连接的都是高速外部设备,如果等待时间过长,容易造成数据丢失。

下面是这种方式的时间对比图:

计算机组成原理(三)_第5张图片

C、DMA与CPU交替访问

我们将DMA和CPU分成等分的工作周期,DMA和CPU交替占用工作周期进行工作。这样做避免了DMA和CPU频繁交换总线和主存的占用权提出占用申请和返回同意申请也是需要时间的),这样也就节省了一些时间(这样不需要申请占用和归还主线及主存的使用权

计算机组成原理(三)_第6张图片

(三)DMA接口的组成

A、DMA接口要实现的功能

  1. 向CPU申请DMA传送。
  2. 处理总线 控制权转交工作
  3. 管理系统总线、控制数据传送
  4. 确定数据传送的首地址和长度,修正传送过程中数据的地址和长度。
  5. 当DMA传送结束时,给出操作完成信号。

B、DMA的组成

计算机组成原理(三)_第7张图片

分析:

  • 三个组件AR(传送首地址寄存器)、WC(是字节数,会存一次不能传完全部数据,该寄存器用来记录已经传完的数据)、DAR(外部设备编号寄存器,用来确认是否是该DMA对应的外部设备)
  • BR(数据缓冲,用来咱存数据)、中断机构是在数据传送完毕(WC归零)时,中断机构在数据缓冲完毕后发出中断请求,结束数据传送。
  • DMA逻辑控制单元,用来控制整个DMA电路的调换,同时负责发出设备启动请求和设备启动反馈等。

分析数据输入过程

计算机组成原理(三)_第8张图片

设备将数据存入BR--->  然后向控制逻辑单元发出请求信号---> 控制单元收到请求信号后,发出总线占用请求--->如果CPU未占用,则获得总线控制权 (CPU给出总线允许信号HLDA)---->AR接入总线中的地址线生效,存入位置被选中---->控制单元返回DMA正在传输数据的信号给外部设备--->控制单元控制数据线将BR中数据根据AR提供的地址,存入主存当中--->储存完毕后增加WC(字计数器)的值,改变AR(使指向下一个地址)--->最后检查WC,中断机构根据自身中断触发器判断是否发出停止DMA服务的请求信号(中断请求)

C、CPU参与下的DMA数据传送过程

CPU预处理阶段,其会将DMA所需要的连接的设备码(DAR)发送到DMA的DAR寄存器、将主存首地址(AR)发送到DMA寄存器、将WC发送到WC寄存器中;上面用作DMA的初始化前提;

DMA数据传送阶段:首先发出总线占用请求,判断是否可占用--->如果可占用,首先将自身AR保存的主存地址发到总线--->然后将数据送I/O设备(或主存)--->单次数据传送完毕后,修改AR指向下一个要保存(或取出)的内存单元,修改字计数器 --->最后检查字计数器看数据是否全部传输完成--->如果没有就再次进行传送数据流程,如果已经结束,就向CPU申请程序中断

后处理阶段:CPU收到DMA程序中断指令之后,执行中断服务程序,结束DMA的工作状态。

  • 后处理是在DMA发出程序中断指令后,CPU执行中断服务程序时要进行的过程,包括三个方面:
    1. 验证存入主存中数据的准确性
    2. 检查是否还需要DMA服务
    3. 验证数据存入或取出过程是否出现错误

(四)DMA接口与系统的连接细节

A、具有公共请求线的DMA请求

计算机组成原理(三)_第9张图片

多个DMA接口共享一条DMA请求线连接到CPU,当CPU收到DMA请求时,会按DMA响应电路依次查看接口是否发出DMA请求,先查询到的接口获得总线访问权限。(离CPU越近的DMA接口越占优势。 

B、具有独立请求线的DMA请求

计算机组成原理(三)_第10张图片

这种方式每个接口都有一个独立的请求线,这样CPU在收到请求后,根据自己的算法或优先级设置给出主存和总线控制权限(通过响应线来响应) ,这种方式更加灵活。 

(五)程序中断方式和DMA方式的对比

程序中断方式 DMA方式
数据传送 程序(CPU调用指令来传送) 硬件(由DMA中控制单元控制传送)
响应时间 一个指令执行完毕 一个存储周期(CPU一个存储周期后即可获得主存和总线的控制权)
处理异常情况 能(中断程序出错后亦可以被中断) 不能(数据传输过程,由硬件控制,没有中断机制)
中断请求目的 为了执行中断程序传递数据 为了执行中断程序,进行数据传递完毕后的后处理工作
优先级 低(中断方式一般连接低速设备) 高(DMA方式,一般连接高速外部设备)

(六)DMA接口的分类

A、选择型(多个外部设备对接一个DMA接口)

计算机组成原理(三)_第11张图片

当CPU需要外部设备输入或输出时,在预指令执行阶段,将选择的设备的设备码存入DMA的设备地址寄存器中---->这样在DMA启动的时候,就只有一台外部设备能够进行数据交互。

  • 可见选择型是物理上多个设备同时连接逻辑上仅能有一台设备实现交互

B、多路型(有多个DMA接口分别对应一个外部设备)

计算机组成原理(三)_第12张图片

  • 每个子通道就是一个DMA,所有的子通道组成一个通道,通道仅有一个数据通路和数据缓冲连接。
  • 每个子通道都有自己的字节缓冲,当CPU执行到数据输入输出指令的时候,将同时需要输入或输出的多个设备地址号发送到不同的子通道上,每个子通道连接一个外部设备,启动后可以同时从多台外部设备中读入数据到对应的字节缓冲中(此时可以看作多个接口和设备同时工作
  • 当每个子通道数据准备完成后,将数据加入数据缓冲时,在主存看来还是仅面对一个通道来进行数据交换。

C、多路型的工作原理和时间空余

计算机组成原理(三)_第13张图片

  • 上图时同时连接了三台设备,三台设备每次占用总线指令发出时间间隔分别为30微秒,45微秒,150微秒。
  • 任何一台设备占用总线后传输数据只需要5微秒。
  • 现在三台设备中打印机率先发出总线和主存占用指令,占用主存和总线,用5微秒实现数据传输;然后稍等一会儿磁带和磁盘同时也请求总线占用,(遵循快速设备优先原则)先用5微秒响应磁盘的请求,然后再用5微秒处理磁带的数据传输。即使这样依然还剩余大量空余时间,这些时间没有被充分利用起来

数字(计算机中的数据表示)

十四、计算机的运算方法

(一)无符号数和有符号数(原码方式表示)

 A、无符号数

根据存储单元给定位数决定无符号数位数,如果是在寄存器中保存,那么寄存器的长度就反映了其能储存的数据范围,如给定寄存器位数为8位,那么数据范围就是0-255(8个0---8个1)

B、有符号数

我们需要一位用0/1来代表正号和负号,还需要一位来代表小数位置(小数没有固定硬件表示)

如: +1101  机器码就是 01101; -1101 机器码就是 11101;+0.1101 机器码就表示为    0  1101(紫色代表小数占用位); -0.1101 机器码表示就是 1  1101(紫色表示小数位); +1101就表示为 01101  这种情况,就是整数,小数位在最后。

C、原码表示法

  • 上面的方式都用最高位作为数的符号位,所以假如整数的二进制表示是n位,原值是x,则x的计算机表示[x],三者满足下列关系。

计算机组成原理(三)_第14张图片

  • 当x为正数时,增加符号位为0,其他位是x(真值)的绝对值,那么绝对值占用位的能够储存的数字范围为2^n>x>=0,区间为何是左开右闭,因为数字位的最高位(n)最大为1,所以永远无法达到2^n;
  • 当x为负数时,增加符号为1,其他位为x,则计算机中表示为1 + x的绝对值,即1-x,因为符号位位1,所以如果符号为算入数据位则范围为[2^(n+1),2^(n+1)+2^n);
  • 小数(绝对值小于1的数)

计算机组成原理(三)_第15张图片

  • 小数转换为原码,只需要将最开始的小数点前面的0作为符号位即可,小数位在符号位之后。
  • 注意用原码表示法的话,0是有正负的,如果原码是0,000则为正零,1,0000则为负零(在数据位为4位时是如此)

C、原码表示法的优势和不足

优势:表示简单易懂;

不足:造成计算单元更复杂,比如同样是加法运算,就分为下面四种情况

加法运算可能情况 结果
两个正整数 加法   正数
一正一负 减法,根据绝对值情况而定,结果可正可负
两负 加法   负数
一负一正 减法  等同于第二种情况

这中情况的出现时因为加数有可能是负数导致的,那我们有没有一个数能够代替负数等价地去直接进行加法运算呢?

补码表示法解决了这个问题。

(二)无符号数和有符号数(补码方式表示)

A、补码的概念

  • 由钟表引入

钟表只有12个小时,指针会不断旋转指向不同的值,这时如果我们这时时针指向6,那么我们要让6变为3有两种方法:

  1. 时针逆时针旋转3个小时
  2. 时针顺时针旋转9个小时
  • 我们抽象概念知,12是模的话,一旦超过12就进行取模运算,得到结果。这样就实现了:6+9=15  和 6-3=3  最终结果就相等;我们把9和-3这样两个数其绝对值的和为12的数就称为互补数,通过这个技巧我们就能实现将正负数变为统一加法操作。

B、计算机实现补码

  • 条件设置:计算机底层我们用四位结构来储存数据,我们在四位储存+1011,我们要让其变为0000也有两种方式:
    1. 1011-1011=0000;
    2. 1011+0101=0000
  • 为什么1011+ 0101 =0000?
  1. 1011+0101=10000,但是因为储存数据的位数只有四位,结果最高位的1超出四位,故数据位还是0000,所以就实现了1011 - 1011 = 1011 + 0101 =0的效果。
  2. 我们同样可以将-1011和1011这两个数看作互补数, 又因为1011 + 0101 = 10000,所以我们知道他们的模数为2^4=16,模数为16。
  3. 如此我们就可以实现将本来的正负数相加变为两个整数相加。如假设存储数据位还是4位,那么-101=+011 (mod=2^3),-0.1011=+1.0101(mod=2^1);
  4. 根据3我们可以知道下面几个结论:
    1. ​​​​​​​mod(模数)= 2^n(n为数据存储单元的位数);
    2. 要想得到一个数的互补数,需要每位取反加一,如+1011 ==》 -0100 ==〉 -0101,故+1011的互补数

​​​​​​​C、发现规律,总结公式

+1011的补码是+1011 + 10000 = 11011,因为四个数据位,还是1011(正数的补码是其本身)。

-1011的补码是-1011 + 10000 = 0101(负数的补码是正数)

为了区分到底是负数还是正数的补码,我们在他们前面加上0或1来区分(0为正数的补码,1为负数的补码)

我们用2^5来计算两个数的补码: 100000 -1011 = 010101,因仅保留五位,故为1,0101;100000 + 1011 = 101011,因为是保留五位,故为0,1011。

可见最高位是1则是负数的补数,最高位是0则是正数的补数,故可得出如下公式:

整数补码公式:

计算机组成原理(三)_第16张图片​​​​​​​

小数补码公式及例子:

这里注意如果x为-1.0000时,其补码为1.0000,不能表示原码,因为1占用了符号位。

​​​​​​​计算机组成原理(三)_第17张图片

D、求补码的快捷方式

正整数:例如+1011 求其补码只需要将+变为0即可==》01011
负整数:例如-1011求其补码,先将-变为1,再将后面数值位取反后+1==〉 10101

        原理:正常来讲:100000 - 1011 = 11111 + 1 - 1011 = 11111 - 1011 + 1;

正小数[0,1): 如 +0.1011,直接将+变为0作为符号位,小数点紧跟后面即为0.1011;

        原理:10.0000 + 0.1011 = 10.1011 因位数仅5位,固为0.1011;

负小数(-1,0]:如 -0.1011 ,直接将-变为1作为符号位,小数点后取反加一,1.0101;

        原理:10.0000 - 0.1011 =1.1111 -0.1011 + 1 = 1.0101;

E、补码和原码之间的转换

真值为时,只需要将[x]补 保留符号位不变,其他取反加一,得到[x]原,例如0,1011(补码) ==》0,0101(原码)

真值为时,原码与补码完全相同。

+0和-0的补码相同,原码不同。

        原理:例如真值为+0.0000 补码为 0.0000,因为0.0000 + 10.0000 =10.0000(截去1,还是原值),负0同理。

(三)无符号数和有符号数(反码方式表示)

A、反码是什么?

反码获取只需要将原码符号位保留不变,正整数反码跟原码相同,负整数保留符号位不变,其他位取反(不用加1)

B、整数补码公式

计算机组成原理(三)_第18张图片​​​​​​​

因为不用加1,相当于模数减1。

C、小数补码公式

计算机组成原理(三)_第19张图片

例子:-0.1010的反码:(2-2^(-4))-0.1010= 1.1111 - 0.1010 = 1.0101;(实际就是x的补码的最后一位减1)

D、+0和-0的原码和反码不一样

计算机组成原理(三)_第20张图片

(四)三种表示方式总结

  1. 符号位和数值位在书写时用“,”或“.”隔开;
  2. 对于正数:其补码=原码=反码
  3. 对于负数:其符号位为1。数值部分取反加1得到补码;数值部分不变得到原码;数值部分取反得到反码;

(五)原码、补码、反码表示范围(以8位数据为例)

计算机组成原理(三)_第21张图片

取个别值分析:

  1. 补码10000000,其对应原码是100000000,一共九位,所以真值为2^8=128,又因为符号位为1,所以达到了用8位表达了-128的效果。
  2. 反码10000000,其对应原码为11111111,所以表示真值为-127。

​​​​​​​(六)[y]补 和[-y]补的关系推导(例题)

设:[y]补 =y0.y1 y2 y3 y4....

情况一:[y]补 =0.y1 y2 y3 y4...

[y]补 =[y]原 ===>y = 0.y1 y2 y3 y4... ===> -y=-0.y1 y2 y3 y4 y5...

===>[-y]补=1.y1 y2 y3... + 2^n;(  字体表示取反)

情况二:[y]补 =1.y1 y2 y3 y4...

[y]原=[y]补 (排斥符号位)取反末位加1 = 1.y1 y2 y3... + 2^n

===> y=-(0.y1 y2 y3... + 2^n )==> -y=0.y1 y2 y3... + 2^n 

===再次数值位取反===>[-y]补 = 0.y1 y2 y3 y4 y5... + 2^n

(七)无符号数和有符号数(移码表示方式)

A、为什么要出现移码?

  • 因为真值转换为补码后,无法准确判断原值大小,所以要引入移码。
    1. 下表是一个补码和原值对照表
十进制 二进制 补码
+21 +10101 0,01011
-21 -10101 1,01011
+31 +11111 0,00001
-31 -11111 1,00001

0,01011 < 1,01011 (错误)因为+21 > -21; 0,00001 < 1,00001 因为+31 > -31;

 B、移码的计算公式

  • 不区分正负值,暂时不能处理小数的移码。n为数值位数,x为真值
  • 举例:
    • 真值x为+10100,那么[x]移=2^5 + 10100 = 1,10100;
    • 真值x为-10100,那么[x]移 = 2^5  -10100 = 11111 - 10100 + 1 =01011 + 1 = 01100;前面加上一位符号位0,01100。

我们可以发现,正数的符号识别位为1,负数的识别位为0。这样就是解决了大小比较问题。

C、移码和补码的比较

十进制 二进制 补码 移码
+21  +10101 0,01011 1,01011
-21  -10101 1,01011 0,01011
+31  +11111 0,00001 1,00001
-31  -11111 1,00001 0,00001
  • 我们发现补码与移码只差一个符号位(符号位相反)

D、移码和补码对照表

计算机组成原理(三)_第22张图片

  • 可以看到-100000的移码是将-100000向右移动了2^5位,用000000来表示(含一个符号位)
  • 移码的特点:
    1. 移码为全零时,表示数据位表示的最小值
    2. +0和-0的移码相同都是 2^n + 0 = 2^n(n表示数据位数)
    3. 用移码表示浮点数的阶码非常容易判断浮点数阶码的大小(阶码马上会学到!

你可能感兴趣的:(算法)