周期挪用(cycle stealing)
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 周期挪用(cycle stealing)
周期挪用方法的基本思想是,当外设准备好一个数据时,DMA控制器就向CPU申请一次总线控制权,CPU在一次总线操作结束时一旦发现有DMA请求,就立即释放总线,让出一个周期给DMA控制器,由DMA控制器控制总线在主存和外设之间传送一个数据,传送结束后立即释放总线,下次外设准备好数据时,又重复上述过程,直到所有数据传送完毕。这种情况下,CPU的工作几乎不受影响,只是在万一出现访存冲突(即CPU和DMA控制器同时要求访问同一个主存)时,CPU挪出一个周期给DMA,由DMA访问主存,而CPU延迟访问主存。这里CPU挪用的是主存存取周期。
## DMA 控制器(DMA controller)
把DMA接口中控制数据传送的硬件逻辑称为DMA控制器。它能像CPU一样控制总线,完成I/O设备和主存间的数据传送。
## 8.4 常见问题解答
1. 机器字长、编址单位、存取宽度、传输宽度、指令字长各指什么?它们之间有何关系?
答:在计算机内部,有指令和数据两大类信息。指令和数据都以二进制形式存放在存储器中,运行程序时,需要把指令和数据从存储器读出,通过总线传输到CPU,然后CPU再通过执行指令来对操作数进行相应的运算,最后把结果数据送到寄存器或存储器中。所以,在设计或使用计算机过程中,要涉及很多问题。例如,指令和数据在存储器中按什么长度存放;写入或读出时按什么长度存取;在总线上传输时同时传送多少位;数据和指令送到CPU后,在CPU的寄存器中按多少位存放;在运算器中按多少位来运算,等等。因而,出现了一系列有关信息单位和信息宽度的概念,这些概念非常重要,但比较容易混淆,需要将很多知
<!-- page: 251 -->
识和概念联系在一起,才能很好地理解这些概念及其相互之间的关系。
它们的定义和关系说明如下。
(1)机器字长:是计算机的一个非常重要的指标。通常所说的32位机器或64位机器,就是指机器的字长是32位或64位。一般情况下,机器字长定义为CPU中在同一时间内一次能够处理的二进制数的位数,实际上就是CPU中定点运算数据通路的位数。在计算机中,“字”的概念经常出现。一个字的宽度并不等于机器字长。字作为机器中所有信息宽度的计量单位,对于某个系列机来说,其字宽总是固定的。例如,在Intel 80x86系列中,一个字的宽度为16位,因此32位是双字,64位是四字。在IBM 303X系列中,一个字的宽度为32位,所以16位为半字,32位为单字,64位为双字。
(2)编址单位:是存储单元的宽度,指存储器中具有相同地址的若干存储元件(或称存储元、存储基元、记忆单元)构成的一个二进制代码的宽度,可以是8位、16位、32位等。现代大多数计算机按字节编址,即编址单位为8位,每个字节有一个地址。由此可见,一个数据(如32位整数、32位浮点数或64位浮点数等)可能占多个存储单元,CPU要求一次从存储器读出或写入的信息也可能有多个存储单元。
(3)存取宽度:是指一次从一个由多个DRAM芯片构成的存储模块中同时读写的信息的宽度。例如,假定某个存储模块由8个 4096 × 4096 × 8 位的DRAM芯片按交叉编址方式构成,则该存储模块的存取宽度是64位,即8个芯片可同时读写,每个芯片同时读写8位,因而最多可以同时存取64位信息。
(4)传输宽度:是总线宽度,也就是一次最多能在总线上传输的数据位数。对于存储器总线来说,总线上传输的信息宽度应该等于存储器的存取宽度。因此,在设计系统时,应考虑传输宽度和存取宽度的匹配,并且每个设备中的总线接口部件也要与这些宽度匹配。
(5)指令字长:是指令的位数。有定长指令字机器和不定长指令字机器。定长指令字机器中所有指令的位数是相同的,目前定长指令字大多是32位指令字。不定长指令字机器的指令有长有短,但每条指令的长度一般都是8的倍数。因此,一个指令字在存储器中存放时,可能占用多个存储单元;从存储器读出并通过总线传输时,可能分多次进行,也可能一次读多条指令。
## 2. I/O 设备和 I/O 接口两部分结合起来就是输入输出系统吗?
答:不是。I/O设备和I/O接口只是I/O硬件部分,输入输出系统应该包括I/O硬件和I/O软件两部分。不同硬件结构的I/O系统,所采用的I/O软件技术差别很大。但不管是哪种,CPU通过直接执行I/O指令或操作系统管理程序,总是或多或少地参与主机和外设交换信息的任务。也就是说,输入输出任务总要有I/O软件的参与。
## 3. I/O 系统的性能如何评价?
答:一般用响应时间和吞吐率两个指标来衡量。不同的I/O系统对于响应时间和吞吐率的要求不同。例如,对于事务处理系统(如订票、存/取款等系统),由于同时会有大量的事务要求处理,而且每个事务对磁盘的访问量很少,所以这种系统主要考虑每秒磁盘的存取次数能否达到很大,使得同时有很多事务在很短的时间内得到快速响应。也就是说,对响应时间的要求更高,而不大在乎吞吐率。但是,像多媒体点播系统,就希望系统的吞吐量很大,要求单位时间内能有大量数据读出,以满足播放要求。
<!-- page: 252 -->
4. 数据传输率中的 $\mathrm{K}, \mathrm{M}, \mathrm{G}$ 等的含义和主存容量中的含义一样吗?在磁盘容量中的含义呢?
答:不一样。在主存容量中 K 表示 $2^{10}$, M 表示 $2^{20}$, G 表示 $2^{30}$。但是,在数据传输率中,因为数据传输速度和时钟频率有关,时钟频率通常以 kHz、MHz、GHz 来表示,所以,传输速率一般用 kB/s、MB/s、GB/s 来表示,这里的 k 表示 $10^{3}$,M 表示 $10^{6}$,G 表示 $10^{9}$。在计算中,可能会混淆使用,因为,数据块的大小还是用 K 表示 $2^{10}$,M 表示 $2^{20}$,G 表示 $2^{30}$,而传输速率又和数据块大小有关,这样使得计算变得很复杂,所以,很多场合下,不区分它们之间的差别,而是看成一样的来处理。
硬盘容量原来以兆字节(MB)或千兆字节(GB)等为单位,有时买家以为 $1\mathrm{GB} = 1024\mathrm{MB} = 2^{30}\mathrm{B}$,但硬盘厂商在标称硬盘容量时通常取 $1\mathrm{G} = 1000\mathrm{M} = 10^{9}$,因此,在BIOS中或在格式化硬盘时标出的容量会比厂家的标称值小。为避免歧义,国际电工委员会在1998年规定,磁盘或文件的容量若以2的幂表示时,其前缀字母后跟字母i表示;若以10的幂表示时,则不跟字母i。例如,$1\mathrm{GiB} = 1024\mathrm{MiB} = 2^{30}\mathrm{B}, 1\mathrm{GB} = 1000\mathrm{MB} = 10^{9}\mathrm{B}$。
5. 什么是 I/O 设备的数据速率?各种外设的数据速率相差很大吗?
答:I/O 设备的数据速率是指在 I/O 设备和主机之间传输数据时的峰值速率。各种 I/O 设备的数据速率相差很大。有键盘、鼠标这种极慢速的设备,大约每秒 10B,也有磁盘和网络设备等这些每秒能达到几十兆字节到上百兆字节以上的快速设备。不同传输速率的外设所用的外设接口不同,在主板上的连接方式不同,所用的 I/O 方式也不同。
6. 数据总线、地址总线和控制总线是分开连接在不同设备上的三种不同的总线吗?
答:不是。它们只是系统总线的三个组成部分,而不能分开来单独连接设备。系统总线用来连接计算机中若干主要部件,一般把在这些部件之间传输的信息分为数据、地址和控制三类,控制信号包括总线命令、定时信号(如时钟和握手信号)、总线请求、总线允许、中断请求和中断允许等,所以系统总线相应地也就分成了三组传输线:数据线、地址线和控制线,有时习惯地把它们分别称为数据总线、地址总线和控制总线。
7. 为什么要有总线判优控制?
答:总线是共享的信息传输介质,早期可以同时有很多设备连接在同一个总线上,但每一时刻总线只能完成一对设备之间的信息传送。当有多个设备同时要使用总线传输信息时,如果允许它们同时把自己的信息发到总线上,就会造成混乱,因此,引入了总线判优机制,能在多个请求使用总线的设备中选择一个,让其控制总线来传输信息,其他设备则需暂时等待并在以后的判优中逐一被选中。
8. 一台机器里面只有一个总线吗?
答:不一定。总线按其所在的位置,分为片内总线、系统总线、通信总线。系统总线是指在CPU、主存、I/O各大部件之间进行互连的总线。可以把所有大的功能部件都连接在一个总线上,也可以用几个总线分别连接不同的设备。因此,有单总线结构、双总线结构、三总线结构等。通常,一台机器里面应该有不同层次的多个总线存在。
9. 一个总线在某一时刻可以有多对主、从设备进行通信吗?
答:不可以。在某一个总线传输周期内,一个总线只能有一个主控设备控制总线,选择一个从设备与之进行通信,或对所有其他设备进行广播通信。因此,某一时刻一个总线不能有多对主、从设备进行通信。
<!-- page: 253 -->
10. 同步总线和异步总线的特点各是什么?各自适用于什么场合?
答:同步总线的特点是各部件采用时钟信号进行同步,协议简单,因而速度快,接口逻辑很少。但总线上的每个部件必须在规定的时间内完成要求的动作,所以一般按最慢的部件来设计公共时钟。而且由于时钟偏移问题,同步总线不能很长。所以,一般同步总线用在部件之间距离短、存取速度较一致的场合。通常,CPU内部总线、处理器总线等采用同步总线。近年来,主存逐步采用同步的DRAM芯片构成,因此,存储器总线也逐步采用同步总线。
异步总线采用应答方式进行通信,允许各设备之间的速度有较大的差异,因此,通常用于具有不同存取速度的设备之间进行通信。通常连接外设或其他机器的通信总线采用异步总线。
11. 同一个总线不能既采用同步方式又采用异步方式通信,是吗?
答:不是,半同步通信总线就可以这样。这类总线既保留了同步通信的特点,又能采用异步应答方式连接速度相差较大的设备。通过在异步总线中引入时钟信号,其就绪和应答等信号都在时钟的上升沿或下降沿有效。通常I/O总线采用半同步总线。例如,PCI总线是一种半同步总线,它的所有事件在时钟下降沿同步,总线设备在时钟开始的上升沿采样总线信号。
12. I/O 接口就是 I/O 端口吗?
答:不是。I/O接口和I/O端口是两个不同的概念,但相互之间有关联。I/O接口是主机和外设之间传送信息的“桥梁”,介于主机和外设之间。主机控制外设的命令信息、传送给外设的数据或从外设取来的数据、外设送给主机的状态信息等都要先存放到I/O接口中,所以,接口中有一些寄存器,用来存放这些控制、数据和状态信息。我们把I/O接口中的这些寄存器称为I/O端口。
13. I/O 端口是如何编址的?
答:一般有两种编址方式:独立编址和统一编址。这里的统一和独立不是指各个不同接口之间的统一和独立关系,而是指所有I/O端口号组成的地址空间(称为I/O地址空间)和所有主存单元号组成的地址空间(称为主存地址空间)之间的关系。
14. CPU 是如何访问 I/O 端口的?
答:在 I/O 指令中给出要访问的端口号,当 CPU 执行 I/O 指令时,根据指令的操作码或地址范围,得知要访问的是 I/O 地址空间,因而在总线的地址线上送出端口号,在总线的控制线上送出 I/O 读或 I/O 写命令,被访问端口所在的接口电路对地址译码后选中相应的端口,并从控制线上取得读/写命令,由接口中的读/写控制电路对被访问端口进行读或写操作。
15. 一个 I/O 接口只能有一个地址吗?
答:不是。每个 I/O 端口对应唯一的一个地址,但一个 I/O 接口中可能有多个程序可访问的寄存器,也就是有多个 I/O 端口,所以应该有多个地址。
16. 程序查询方式下,外设的数据是直接和 CPU 交换的吗?
答:是的。程序查询方式下,整个输入输出过程是通过CPU执行查询程序完成的,所有信息(命令、数据、状态)的交换具体由查询程序中的I/O指令进行控制,因而外设的数据是直接和CPU交换的。
<!-- page: 254 -->
外设的数据和状态信息通过 I/O 接口中设备侧的电缆线(通信总线)送到 I/O 接口中,连同接口本身的状态信息一起记录到相应的寄存器中,CPU 再通过执行输入指令(如 80x86 中的 IN 指令)从 I/O 端口中将状态或数据取到 CPU 的寄存器中。CPU 送到外设的数据和命令字,通过执行输出指令(如 80x86 中的 OUT 指令)从 CPU 中的寄存器送到相应的 I/O 端口中。
17. 中断方式下,外设的数据是直接和 CPU 交换的吗?
答:是的。中断方式下,当外设完成任务(如打印完一个字符、键盘有按键),或外设发生了特殊事件(如打印机缺纸、过程控制中温度太高、采样定时到)时,外设通过向 CPU 发中断请求,来中止 CPU 正在执行的程序,转到相应的中断服务程序去执行,处理完后,回到原被中止的程序继续执行。通常在 CPU 执行中断服务程序过程中完成数据的交换。例如,从键盘缓冲取数据,向打印机缓冲发送打印字符、取采样数据等。这些都是通过 CPU 执行输入输出指令来完成的,因而,对于采用中断方式的输入输出过程,外设的数据是直接和 CPU 交换的。
18. DMA 方式下,外设的数据是直接和 CPU 交换的吗?
答:不是。DMA 方式适合于像磁盘一类的高速设备,这类设备以成批方式与主机交换几百到几千字节数据,CPU 不可能放得下那么多数据。因此,DMA 方式下,设备直接和主存进行数据交换,由专门的硬件(DMA 控制器)控制在主存和外设之间进行数据传送。
19. 中断方式下,外设任何时候都可以申请中断并马上得到响应吗?
答:不是。中断方式下,外设何时发出中断请求是由外设接口中的中断逻辑决定的,不受 CPU 的限制,但何时响应中断与 CPU 执行指令过程有关。CPU 总是在一条指令执行完、取下条指令之前去查询有无中断请求。如果此时是开中断状态,并有未被屏蔽的中断请求发生,则 CPU 进入中断响应周期,自动执行一条隐指令,完成关中断、保护断点、取中断向量三个操作。因此,不是任何时候都马上响应中断,中断响应的条件有三个:① CPU 处于开中断状态(中断允许触发器 EINT 置“1”状态);② 至少有一个未被屏蔽的中断请求发生;③ 一条指令执行结束。
20. 为什么在介绍 CPU 设计时要讲中断的概念,在介绍 I/O 系统时又讲中断的概念?
答:在 CPU 执行程序过程中,有两种情况会打断程序的执行,一种情况是 CPU 正在执行的指令出现了异常或设置了陷阱;另一种情况是指令执行正常,但外部设备出现了特殊事件,要求 CPU 处理。一般把前者称为异常,后者称为中断(也有很多系统或教科书不分异常和中断,全部称为中断)。
在涉及 CPU 设计时,必须考虑在数据通路中如何实现异常和中断处理,包括:如何设置“开/关中断”状态,如何判断是否发生了异常和中断,如何识别是哪类异常和中断,怎样保存断点,如何切换到中断服务程序,等等。因此,在第 5 章介绍 CPU 设计时谈到了异常和中断的概念。
同时,中断作为一种 I/O 方式,在许多采用中断方式的外设接口电路中,必须要有相应的中断处理逻辑,因此,在本章涉及 I/O 系统设计时,也谈到了很多有关中断的概念。
21. 为什么在响应中断的时候保存断点,而在处理中断的时候保存现场?
答:断点是中断返回到被中断程序继续执行处指令的地址(即响应中断时 PC 的值),断点在中断响应时先被保存到栈中,否则,当取来中断服务程序的首地址送 PC 后,原来作为
<!-- page: 255 -->
断点的 PC 的值就被破坏了;而现场是被中断的原程序在断点处各个寄存器的值,只要在这些寄存器再被使用前保存到栈中就行了。因为在实际处理中断事件过程中可能要用到这些寄存器,所以在实际处理之前的准备阶段来保存现场(寄存器压栈),而在实际处理后的结束阶段再恢复现场(寄存器出栈)。这样就能保证被中断程序的现场不被中断服务程序破坏。
22. 单重中断和多重中断的区别是什么?
答:单重中断情况下,在中断处理整个过程中,不允许响应新的中断请求,其做法是在中断响应开始时关中断(使中断允许触发器置 0),而直到中断处理结束后才开中断,然后返回到原断点处继续执行。
多重中断系统中,如果在进行某个中断请求的处理过程中,又发生了新的中断请求,则可以中止正在进行的中断处理,转到新的中断服务程序执行。因此,在中断处理过程中,应该开中断,允许响应新的中断请求。其做法是在实际处理中断事件前就开中断,而不是像单重中断那样在处理后才开中断。这样保证在实际中断处理过程中可以响应新的中断请求。
23. 向量中断、中断向量、向量地址三个概念是什么关系?
答:中断向量 每个中断源都有对应的处理程序,我们称这个处理程序为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
向量地址 中断向量表或中断向量跳转表中每个表项所在的主存地址或表项的索引值,称为向量地址或中断类型号。
向量中断 是指一种识别中断源的技术或方式。识别中断源的目的就是要找到中断源对应的中断服务程序的入口地址,即获得向量地址。采用向量中断进行中断源识别的做法如下:在中断控制器中,通过某种硬件排队线路(如菊花链、并行判优等),对所有未被屏蔽的中断请求进行排队,选出优先级最高的中断源,然后对其编码,得到该中断源的编号(可以转换为向量地址)。通过总线将其取到 CPU 中,并转换成向量地址,从而取出中断服务程序入口地址,或跳转到中断服务程序。还有一种是用程序(称为中断查询程序)进行中断源识别的软件方法。
24. 禁止中断和屏蔽中断是同一个概念吗?
答:它们是两个完全不相关的概念。
禁止中断就是关中断,也即将中断允许触发器置为 0,此时,任何中断请求都得不到响应。
屏蔽中断是多重中断系统中的一个概念,是指某个中断正在被处理的时候,如果有其他新的中断请求发生,那么通过设置中断屏蔽位,可以确定是否允许响应新发生的中断。屏蔽中断反映了正在处理的中断与其他各中断之间的处理优先级顺序,所以每个中断都有一个中断屏蔽字,其中的每一位对应一个中断的屏蔽位。响应某个中断后,就会把该中断的中断屏蔽字送到中断屏蔽字寄存器中,在中断排队前,其中的每一位和中断请求寄存器中的对应位进行“与”操作,因而,只有未被屏蔽的中断源进入排队线路,从而有可能得到响应。
25. 中断响应优先级和中断处理优先级一样吗?
答:不一样,这是两个不同的概念。中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变;而中断处理优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理优先级低,如果是,就中止正在处理的中断,
<!-- page: 256 -->
转到新中断去处理,处理完后回到原被中止的中断继续处理。
26. DMA方式下,在主存和外设之间有一条物理通路直接相连吗?
答:没有。通常所说的DMA方式下,数据在主存和外设之间直接进行传送,其含义并不是说在主存和外设之间建立一条物理上的直接通路,而是在主存和外设之间通过外设接口、系统总线以及总线桥接部件等连接,建立起一个信息可以互相通达的通路。“直接通路”是逻辑上的含义,物理上避盘和主存不是直接相连的。
27. DMA方式下,CPU一点开销都没有吗?
答:不是。DMA方式下的数据交换过程分以下三个步骤:
(1)DMA控制器的初始化。将所要传送的数据个数、内存地址、传送方向等送到DMA控制器。这个过程由CPU执行指令来完成。初始化结束后,CPU发送启动避盘定位和DMA传送的命令,这也是通过CPU执行输出指令来完成的。
(2)DMA传送。这个过程整个都是由硬件来完成的,主要由DMA控制器控制系统总线,完成数据在主存和外设之间的数据传送。
(3)DMA传送结束处理。DMA传送结束后,向CPU发出“DMA结束”中断请求,由CPU执行相应的中断服务程序进行数据校验等后处理工作。
综上所述,DMA方式下,CPU要进行初始化和后处理两部分工作,因此,不是一点开销都没有。只是相对于程序查询方式和中断方式来说,CPU介入要少得多,CPU不需要介入主要的数据传送过程。
28. CPU对DMA请求和中断请求的响应时间是否一样?
答:不一样。DMA方式下,向CPU请求的是总线控制权,要求CPU让出总线控制权给DMA控制器,由DMA控制器来控制总线完成主存和外设之间的数据交换,因此,CPU只要用完总线后就可以响应请求,释放总线,让出总线控制权。CPU总是在一次总线事务完成后响应,因此,DMA响应时间应该少于一个总线周期;而中断方式下请求的是CPU时间,要求CPU中止正在执行的程序,转到中断服务程序去执行,通过执行中断服务程序,对中断事件进行相应的处理。CPU总是要等到一条指令执行结束后,才去查询有无中断请求,所以响应时间少于一个指令周期的时间。
29. 挪用周期方式下,DMA控制器窃取的是什么周期?
答:周期挪用法的基本思想是,当外设准备好一个数据时,DMA控制器就向CPU申请一次总线控制权,CPU在一个总线事务结束时,一旦发现有DMA请求,就立即释放总线,让出一个周期给DMA控制器,由DMA控制器控制总线在主存和外设之间传送一个数据,传送结束后立即释放总线,下次外设准备好数据时,又重复上述过程,直到所有数据传送完毕。这种情况下,CPU的工作几乎不受影响,只是在万一出现访存冲突时,CPU挪出一个周期给DMA,由DMA访问主存,而CPU延迟访问主存。这里CPU挪出的是主存的存储周期。
30. 用户程序能直接对外部设备进行读写或控制吗?为什么?
答:现代计算机系统中,用户程序不能直接对外部设备进行读写或控制,只有操作系统才能与外部设备直接打交道,控制外部设备完成具体的I/O操作。因此,操作系统在I/O子系统中承担极其重要的作用,这主要是由I/O子系统以下三个特性决定的。
(1)共享性。I/O子系统被多个进程共享,因此必须由操作系统对共享的I/O资源统
<!-- page: 257 -->
一调度管理,以保证用户程序只能访问自己有权访问的那部分 I/O 设备或文件,并使系统的吞吐率达到最佳。
(2) 复杂性。I/O 设备控制的细节比较复杂,如果由最上层的用户程序直接控制,则会给广大的应用程序开发者带来麻烦,因而需操作系统提供专门的驱动程序进行控制,这样可以对应用程序员屏蔽设备控制的细节,简化应用程序开发。
(3) 异步性。I/O 子系统的速度较慢,而且不同设备之间的速度也相差较大,因而 I/O 设备与主机之间的信息交换方式通常使用异步的中断 I/O 方式,中断导致从用户态向内核态转移,因此,I/O 处理须在内核态完成,通常由操作系统提供的驱动程序来处理 I/O。