【分析解答】

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

# 【分析解答】

若采用独立编址方式对 I/O 端口进行编号,则主存地址编号和 I/O 端口编号可能会相


<!-- page: 271 -->

同,所以,无法利用访存指令来访问I/O端口,必须提供专门的输入/输出指令,包括I/O读指令和I/O写指令。在执行I/O指令时,CPU会送出相应的I/O读和I/O写控制信号,以使和执行访存指令时送出的存储器读和存储器写信号有所区别。

9. 假设有一个磁盘,每面有200个磁道,盘面总存储容量为 $1.6\mathrm{MB}(1\mathrm{M} = 10^{6})$,磁盘旋转一周时间为 $25\mathrm{ms}$,每道有4个数据区,每两个数据区之间有一个间隙,磁头通过每个间隙需 $1.25\mathrm{ms}$。请回答下列问题:

(1)从该磁盘上读取数据时的最大数据传输率是多少?
(2) 假如有人为该磁盘设计了一个与主机之间的接口, 如图 8.1 所示, 磁盘每读出一位, 串行送入一个移位寄存器, 每当移满 16 位后向处理器发出一个请求交换数据的信号。在处理器响应该请求信号并读取移位寄存器内容的同时, 磁盘继续读出一位一位数据并串行送入移位寄存器中, 如此继续工作。已知处理器在接到请求交换的信号以后, 最长响应时间是 $3\mu \mathrm{s}$ , 那么这样设计的接口能否正确工作? 若不能则应该如何改进?

图8.1 题9中的示意图


# 【分析解答】

(1)磁道容量为 $1.6 \times 10^{6} \mathrm{~B} / 200 = 8000 \mathrm{~B}$,数据区容量为 $8000 \mathrm{~B} / 4 = 2000 \mathrm{~B}$,转过一个数据区的时间为 $(25 - 1.25 \times 4) \mathrm{ms} / 4 = 5 \mathrm{~ms}$,因而磁盘的最大数据传输率为 $2000 \mathrm{~B} / 5 \mathrm{~ms} = 4 \times 10^{5} \mathrm{~B} / \mathrm{s} = 0.4 \mathrm{MB} / \mathrm{s}$。
(2)磁盘传送1位的时间为 $10^{6} \mu \mathrm{s} / (8 \times 4 \times 10^{5}) = 0.31 \mu \mathrm{s} &lt; 3 \mu \mathrm{s}$。因为传送1位的时间小于 $3 \mu \mathrm{s}$,因此,当处理器经过 $3 \mu \mathrm{s}$ 来读取移位寄存器中的数据时,磁盘已经读出了新的数据位,并将原先请求被读的移位寄存器中的数据冲刷掉了。显然,这样的设计接口不能正确工作。传送一个字(16位)所用的时间为 $2 \mathrm{~s} / (4 \times 10^{5}) = 5 \mu \mathrm{s} &gt; 3 \mu \mathrm{s}$,所以可以在磁盘接口中增加一个16位数据缓冲器。当16位移位寄存器装满后,首先送入数据缓冲寄存器,在读出下一个16位数据期间,上次读出的16位数据从数据缓冲器中被取走。
10. 假定一台计算机带有 20 个终端同时工作, 在运行用户程序的同时, 能接收来自任意一个终端输入的字符信息, 并将字符回送显示或打印。每一个终端的键盘输入部分有一个数据缓冲寄存器 RDBR, $(i = 1 \sim 20)$, 当在键盘上按下某一个键时, 相应的字符代码即进入 RDBR, 并使它的“完成”状态标志 Done, $(i = 1 \sim 20)$ 置 1, 要等处理器把该字符代码取走后, Done, 标志才自动清 0 (复位)。每个终端显示或打印输出部分也有一个数据缓冲寄存器 TDBR, $(i = 1 \sim 20)$, 并有一个 Ready, $(i = 1 \sim 20)$ 状态标志, 该状态标志为 1 时, 表示相应的 TDBR, 是空着的, 准备接收新的输出字符代码, 当 TDBR, 接收了一个字符代码后, Ready, 标志自动清 0, 并将字符送终端显示或打印。为了接收终端的输入信息, 处理器为每个终端设计了一个指针 PTR, $(i = 1 \sim 20)$ 指向为该终端保留的主存输入缓冲区。处理器采用下列


<!-- page: 272 -->

两种方案输入键盘代码,同时回送显示或打印。

(1) 每隔一固定时间 $T$ 转入一个状态检查程序 DEVCHC,顺序地检查全部终端是否有任何键盘信息输入,如果有则顺序完成之。
(2) 允许任何有键盘信息输入的终端向处理器发出中断请求。全部终端采用共同的向量地址,利用它使处理器在响应中断后,转入一个中断服务程序 DEVINT,由后者询问各终端状态标志,并为最先遇到的有中断请求的终端服务,服务结束后返回用户程序。

要求画出 DEVCHC 和 DEVINT 两个程序的流程图。

## 【分析解答】

定时查询程序 DEVCHC 和中断服务程序 DEVINT 的流程分别如图 8.2 和图 8.3 所示。图中用 $(x)$ 表示 $x$ 的内容,$x$ 可能是存储单元地址或寄存器编号。此外,因为标志 Done, 和 Ready, 由硬件控制自动清 0(复位),所以,流程图中没有对这两个标志赋值的操作。程序 DEVINT 的流程图中,如果所有终端都检测不到 Done 标志为 1,则说明所有终端都没有键盘输入,即都没有中断请求,此时不应该进入 DEVINT 处理,因此需报告“出错”。

图 8.2 定时查询程序 DEVCHC 的处理流程

11. 若某计算机中断系统有 5 个中断源,分别记为中断源 1、中断源 2、中断源 3、中断源 4 和中断源 5(又称 1、2、3、4、5 号中断源,简称 1、2、3、4、5 号中断),其中断响应优先级为中断源 $1&gt;$ 中断源 $2&gt;$ 中断源 $3&gt;$ 中断源 $4&gt;$ 中断源 5,而中断处理优先级为中断源 $1&gt;$ 中断源 $4&gt;$ 中断源 $5&gt;$ 中断源 $2&gt;$ 中断源 3。要求:
(1) 设计各级中断服务程序的中断屏蔽位(假设 1 为屏蔽,0 为开放)。
(2) 若在运行用户程序时,中断源 2 和中断源 4 同时发生中断请求,而在处理 2 号中断源的过程中,中断源 1、中断源 3 和中断源 5 同时发生中断请求,试画出此时 CPU 运行过程示意图。


<!-- page: 273 -->

图8.3 中断服务程序DEVINT的处理流程

## 【分析解答】

(1)由题意可知,中断源1的处理优先级最高,说明1号中断源对其他所有中断源都屏蔽,其屏蔽字为全1:3号中断源的处理优先级最低,所以除了3号中断源之外,对其他中断源全都开放,其屏蔽字为00100。以此类推,得到所有各个中断源的中断服务程序中设置的中断屏蔽字如表8.1所示。

表 8.1 题 11 中的中断屏蔽字

[tbl-51.md](tbl-51.md)

(2)在运行用户程序时,同时出现中断源2和中断源4,因为用户程序对所有中断源都开放,所以,在中断响应优先级排队电路中,中断源2和中断源4进行排队判优,根据中断响应优先级中断源 $2&gt;$ 中断源4,因此先响应2号中断源。在CPU执行中断源2的中断服务程序过程中,首先保护现场、保护旧屏蔽字、设置新的屏蔽字01100,然后,在具体中断处理前先开中断。一旦开中断,则马上响应4号中断源,因为2号中断源的中断屏蔽字中对4号中断源的屏蔽位是0,即对4号中断源是开放的。在4号中断处理结束后,回到2号中断源的中断服务程序执行;在具体处理2号中断过程中,同时发生了1、3、5号中断源请求,因为2号中断对1、5号中断开放,对3号中断屏蔽,所以只有1号和5号两个中断源进行排队判优,根据中断响应优先级中断源 $1&gt;$ 中断源5,所以先响应1号中断源。因为1号中断源中断处理优先级最高,所以在其处理过程中不会响应任何新的中断请求,直到1号中断处理结


<!-- page: 274 -->

束,然后返回 2 号中断;因为 2 号中断对 5 号中断开放,所以在 2 号中断服务程序中执行一条指令后,又转去执行 5 号中断服务程序,执行完后回到 2 号中断服务程序,在 2 号中断服务程序执行过程中,虽然 3 号中断有请求,但是,因为 2 号中断对 3 号中断不开放,所以,3 号中断一直得不到响应。直到 2 号中断处理完回到用户程序,才能响应并处理 3 号中断。CPU 运行过程如图 8.4 所示。

图 8.4 CPU 运行程序的执行轨迹

12. 某计算机的 CPU 主额为 $500\mathrm{MHz}$,所连接的某外设的最大数据传输率为 $20\mathrm{kB/s}$,该外设接口中有一个 16 位的数据缓存器,相应的中断服务程序的执行时间为 500 个时钟周期。请回答下列问题:

(1)是否可用中断方式进行该外设的输入输出?若是,在该设备持续工作期间,CPU 用于该设备进行输入输出的时间占整个 CPU 时间的百分比大约为多少?
(2)若该外设的最大数据传输率是 $2\mathrm{MB/s}$,则可否用中断方式进行输入输出?

【分析解答】

(1)因为该外设接口中有一个 16 位数据缓存器,所以,若用中断方式进行输入输出,可以每 16 位数据进行一次中断请求,因此,中断请求的时间间隔为 $2 \times 10^{6} \mu\mathrm{s} / (20 \times 10^{3}) = 100 \mu\mathrm{s}$。

对应的中断服务程序的执行时间为 $10^{6} \mu\mathrm{s} / (500 \times 10^{6}) \times 500 = 1 \mu\mathrm{s}$,因为中断响应过程就是执行一条隐指令的过程,所用时间相对于中断处理时间(即执行中断服务程序的时间)而言,几乎可以忽略不计,因而整个中断响应并处理的时间大约 $1 \mu\mathrm{s}$ 多一点,远远小于中断请求的间隔时间。因此,可以用中断方式进行该外设的输入输出。

若用中断方式进行该设备的输入输出,则该设备持续工作期间,CPU 用于该设备进行输入输出的时间占整个 CPU 时间的百分比大约为 $1 / 100 = 1\%$(也可以通过考查 1 秒内 500M 个时钟周期中有多少时钟周期用于中断来计算百分比,其计算公式为 $(10^{6} / 100 \times 500) / (500 \times 10^{6}) = 1\%$。

(2)若外设的最大传输率为 $2\mathrm{MB/s}$,则中断请求的时间间隔为 $2 \times 10^{6} \mu\mathrm{s} / (2 \times 10^{6}) = 1 \mu\mathrm{s}$。而整个中断响应并处理的时间大约 $1 \mu\mathrm{s}$ 多一点,中断请求的间隔时间小于中断响应和处理时间,即中断处理还未结束就会有该外设新的中断到来,所以不可以用中断方式进行该外设的输入输出。

13. 假设某计算机中软盘以中断方式进行数据输入输出,每次中断请求传输一个 32 位数,已知软盘的数据传输率为 $500\mathrm{kB/s}$,每次传输的 CPU 开销(包括中断响应和处理)为 1000 个时钟周期,CPU 的主额为 $500\mathrm{MHz}$,则软盘在持续工作时,CPU 用于软盘数据传送


<!-- page: 275 -->

的时间占CPU整个时间的百分比是多少?

## 【分析解答】

软盘准备32位数据的时间为 $4 \times 10^{6} \mu \mathrm{s} / (500 \times 10^{3}) = 8 \mu \mathrm{s}$ 。因此,软盘每隔 $8 \mu \mathrm{s}$ 发一次中断请求,CPU响应并处理中断所用时间为 $1000 \times 10^{6} \mu \mathrm{s} / (500 \times 10^{6}) = 2 \mu \mathrm{s}$ ,因此,每次CPU花 $2 \mu \mathrm{s}$ 取走数据后,就去执行其他程序;过 $8 \mu \mathrm{s}$ 后软盘又准备好下一个数据,又发中断请求,CPU响应并处理中断以取走数据,然后又去执行其他程序……直到所有需要的数据传送完。因此,当软盘持续工作时,CPU用于软盘数据传送的时间占CPU总时间的百分比是 $2 / 8 = 0.25 = 25\%$ 。

14. 某计算机 CPU 主频为 $500\mathrm{MHz}$,CPI 为 5。假定某外设的数据传输率为 $0.5\mathrm{MB/s}$,采用中断方式与主机进行数据传送,传输单位为 32 位,对应的中断服务程序包含 18 条指令,中断响应等其他开销相当于 2 条指令的执行时间。请回答下列问题,要求给出计算过程。

(1) 在中断方式下,CPU 用于该外设 I/O 的时间占整个 CPU 时间的百分比是多少?

(2) 当该外设的数据传输率达到 $5\mathrm{MB / s}$ 时,改用 DMA 方式传送数据。假定每次DMA传送的块大小为5000B,DMA预处理和后处理的总开销为500个时钟周期,则CPU用于该外设I/O的时间占整个CPU时间的百分比是多少?(假设DMA与CPU之间没有访存冲突)

## 【分析解答】

(1) 中断方式下,每当外设准备好 32 位数据(读操作)或外设接口中的 32 位数据缓存为空已准备好接收新数据(写操作)时,就向 CPU 发中断申请,要求 CPU 通过执行中断服务程序来取走缓存中的 32 位数据或向缓存送 32 位数据。CPU 每次执行中断服务程序花 18 条指令的时间,其他如中断响应等的开销相当于 2 条指令的时间,CPI 为 5。因此,每次 CPU 用于中断处理(数据传送服务)的时钟周期数为 $5 \times 18 + 5 \times 2 = 100$ 。外设的数据传输率为 $0.5\mathrm{MB / s}$,每次中断传送 32 位数据,占 4B,因此,外设每秒申请的中断次数为 $0.5 \times 10^{6} / 4 = 125000$ ,因而每秒 CPU 用于中断响应和处理的时间开销为 $100 \times 125000 = 12500000 = 12.5\mathrm{M}$ 个时钟周期,CPU 的时钟频率为 $500\mathrm{MHz}$,即 CPU 每秒内产生 $500\mathrm{M}$ 个时钟周期,故 CPU 用于外设 I/O 的时间占整个 CPU 时间的百分比为 $12.5 \times 10^{6} / (500 \times 10^{6}) = 2.5\%$ (也可通过考查相邻两次中断请求间隔时间内 CPU 用于中断的时间来计算,即 $(100 \times 1 / (500 \times 10^{6})) / (4 / (0.5 \times 10^{6})) = 2.5\%$ 。

(2) 当外设数据传输率提高到 $5\mathrm{MB / s}$ 时,每秒内产生的DMA次数为 $5\times 10^{6} / 5000 = 1000$ ;每次DMA传送前都需要进行DMA初始化(预处理),DMA结束后还要进行中断处理(后处理),已知这两个处理总共需要500个时钟周期,所以,CPU用于DMA处理的总开销为 $1000\times 500 = 500000 = 0.5\mathrm{M}$ 个时钟周期;而CPU的时钟频率为 $500\mathrm{MHz}$,即CPU每秒内产生 $500\mathrm{M}$ 个时钟周期,故CPU用于该外设I/O的时间占整个CPU时间的百分比 $0.5\times 10^{6} / (500\times 10^{6}) = 0.1\%$ (也可通过考查相邻两次DMA请求间隔时间内CPU用于该外设I/O的时间来计算,即 $(500\times 1 / (500\times 10^{6})) / (5000 / (5\times 10^{6})) = 0.1\%$ 。

15. 某计算机字长 16 位,没有 cache,运算器一次定点加法时间等于 100ns,配置的磁盘旋转速度为每分钟 3000 转,每个磁道上记录两个数据块,每一块有 8000B,两个数据块之间间隙的越过时间为 2ms,主存存储周期为 500ns,存储器总线宽度为 16 位。

(1) 磁盘读写数据时的最大数据传输率是多少?平均数据传输率是多少?


<!-- page: 276 -->

(2) 若磁盘按最大数据传输率与主存交换数据时 CPU 没有访问主存,则此时主存频带空闲百分比是多少?
(3) 直接寻址的“存储器-存储器”S-S型加法指令在无磁盘I/O操作打扰时的执行时间为多少?此时主存频带空闲百分比是多少?当磁盘I/O操作与一连串这种S-S型加法指令执行同时进行时,这种S-S型加法指令的最快和最慢执行时间各是多少?(假定采用多周期处理器方式,CPU时钟周期等于主存周期)

【分析解答】

(1) 磁盘旋转一周所需时间为 $60 \times 10^{3} \mathrm{~ms} / 3000 = 20 \mathrm{~ms}$ , 单个数据块的传输时间为 $(20 \mathrm{~ms} / 2) - 2 \mathrm{~ms} = 8 \mathrm{~ms}$ , 所以最大数据传输率为 $8000 \mathrm{~B} / (8 \mathrm{~ms} / 1000) = 1 \mathrm{MB} / \mathrm{s}$ 。平均数据传输率为 $2 \times 8000 \mathrm{~B} / (20 \mathrm{~ms} / 1000) = 0.8 \mathrm{MB} / \mathrm{s}$ 。
(2) 磁盘最大数据传输率为 $1\mathrm{MB / s}$ , 存储器总线宽度为 $16\mathrm{b} = 2\mathrm{B}$ , 故每隔 $2\times 10^{5}\mathrm{ns}/(1\times 10^{6}) = 2000\mathrm{ns}$ 产生一个DMA请求, 即每 $2000 / 500 = 4$ 个主存周期中有一个被DMA挪用, 此时, CPU 没有访问主存, 因此, 4 个主存周期中有 3 个空闲, 故主存频带空闲百分比是 $75\%$ , 如图 8.5 所示, 图中箭头处开始的一个主存周期被 DMA 挪用。

图8.5 无CPU访存时主存周期被DMA使用的情况

(3) 无 I/O 打扰时, 执行一条直接寻址的 S-S 型加法指令的过程如图 8.6 所示, 包括取指令、取源操作数 1、取目的操作数 (源操作数 2)、执行、写结果, 因此执行时间为 $5 \times 500 \mathrm{~ns} = 2500 \mathrm{~ns} = 2.5 \mu \mathrm{s}$ 。此时, 每个指令周期所包含的 5 个时钟周期中, 只有执行阶段不访问主存, 所以主存频带空闲百分比是 $20\%$ 。

图8.6 无I/O打扰时主存周期被CPU使用的情况

当磁盘I/O操作与一连串这种S-S型加法指令同时进行时,可能因为CPU和DMA同时访存而使指令的执行时间被延长。每次DMA请求要求挪用一个主存周期来访问主存,同时CPU执行指令时也要求访问主存,当两者发生冲突时,DMA优先级高,CPU的访存请求被延迟。因为每隔2000ns产生一个DMA请求,因此每4个主存周期必定有一个被DMA所挪用。此时,主存周期的占用情况如图8.7所示。

图8.7 CPU和DMA交替串行访问主存时的情况

由图8.7可知,最好的情况是在S-S型加法指令执行过程中没有访存冲突(如图8.7中最开始的一个指令周期),此时最快,指令执行时间为 $2.5\mu \mathrm{s}$ ;最坏的情况是有一次访存冲突(如图8.7中第二个指令周期),此时最慢,指令执行时间为 $2.5\mu \mathrm{s} + 500\mathrm{ns} = 3\mu \mathrm{s}$ 。


<!-- page: 277 -->

16. 某计算机所有指令都可用两个总线周期完成,一个总线周期用来取指令,另一个总线周期用来存取数据。假定总线宽度为 8 位,每个总线周期为 $250\mathrm{ns}$,因而每条指令的执行时间为 $500\mathrm{ns}$。若该计算机中配置的磁盘每个磁道有 16 个 512B 的扇区,磁盘旋转一圈的时间是 $8.192\mathrm{ms}$。请回答下列问题:

(1)在磁盘不工作时,主存频带空闲百分比是多少?
(2)若采用周期挪用法进行 DMA 传送,则该计算机执行指令的速度由于 DMA 传送而降低了多少?
(3)若采用周期挪用法进行 DMA 传送,总线宽度改为 16 位,则该计算机执行指令的速度由于 DMA 传送而降低了多少?

【分析解答】

(1)因为所有指令的每个阶段都要访问主存,所以即使没有磁盘访问主存,CPU 也把主存周期占满了。因此,主存频带空闲百分比是 0。
(2)磁盘的平均数据传输率为 $16 \times 512\mathrm{B} / (8.192 / 10^{3})\mathrm{s} = 1000000\mathrm{B} / \mathrm{s} = 1\mathrm{MB} / \mathrm{s}$。当总线位宽为 8 位时,DMA 控制器每隔 $1\mathrm{s} / (1 \times 10^{6}) = 10^{-6}\mathrm{s} = 1\mu \mathrm{s}$ 申请一次数据传送,在 $1\mu \mathrm{s}$ 期间 CPU 共执行 $1 / (500 / 1000) = 2$ 条指令。因此,每 2 条指令的执行被插入一个总线周期用于一次数据传送,即平均每条指令延长了 $250\mathrm{ns} / 2 = 125\mathrm{ns}$。因而,计算机执行指令的速度降低了 $125 / 500 = 25\%$。
(3)当总线位宽为 16 位时,DMA 控制器每隔 $2\mathrm{s} / (1\times 10^{6}) = 2\times 10^{-6}\mathrm{s} = 2\mu \mathrm{s}$ 申请一次数据传送,在 $2\mu \mathrm{s}$ 期间 CPU 共执行 $2 / (500 / 1000) = 4$ 条指令,因此,每 4 条指令的执行被插入一个总线周期用于一次数据传送,也即平均每条指令延长了 $250\mathrm{ns} / 4 = 62.5\mathrm{ns}$。因而,计算机执行指令的速度降低了 $62.5 / 500 = 12.5\%$。

17. 假设一个主频为 $1\mathrm{GHz}$、CPI 为 5 的 CPU 需要从某个成块传送的 I/O 设备读取 1000B 的数据到主存缓冲区中,该 I/O 设备一旦启动即按 $50\mathrm{kB/s}$ 的数据传输率向主机传送 1000B 数据,每个字节的读取、处理并存入内存缓冲区需要 1000 个时钟周期,则以下 4 种方式下,在 1000B 的读取过程中,CPU 用在该设备的 I/O 操作上的时间分别为多少?占整个 CPU 时间的百分比分别是多少?

(1)采用定时查询方式,每次处理一个字节,一次状态查询至少需要 60 个时钟周期。
(2)采用独占查询方式,每次处理一个字节,一次状态查询至少需要 60 个时钟周期。
(3)采用中断 I/O 方式,外设每准备好一个字节发送一次中断请求。每次中断响应需要 2 个时钟周期,中断服务程序的执行需要 1200 个时钟周期。
(4)采用周期挪用 DMA 方式,每挪用一次主存周期处理一个字节,一次 DMA 传送完成 1000B 的传送,DMA 初始化和后处理的时间为 2000 个时钟周期,CPU 和 DMA 之间没有访存冲突。
(5)如果设备的速度提高到 $5\mathrm{MB / s}$,则上述 4 种方式中,哪些是不可行的?为什么?对于可行的方式,计算出 CPU 在该设备 I/O 操作上所用的时间占整个 CPU 时间的百分比。
(6)如果外设不是成块传送设备,而是字符型设备,CPU 每处理完一个字节后都要重新启动外设,外设在启动后 $0.02\mathrm{ms}$ 时间准备好一个字节。每个字节的读取、处理(包括启动下次操作)并存入内存缓冲区还是需要 1000 个时钟周期,假定 CPU 总是在查询到就绪后立即启动外设或在中断服务程序执行了 20 条指令后启动外设,则在 (1)~(3) 这三种方式


<!-- page: 278 -->

下,CPU在该设备的I/O操作上所用的时间占整个CPU时间的百分比分别是多少?

(7)根据对以上各种数据进行分析,你可以得出哪些结论?

【分析解答】

主频为 $1\mathrm{GHz}$,所以,时钟周期为 $1\mathrm{s} / (1\times 10^{9}) = 1\mathrm{ns}$。因为每个字节的读取、处理并存入内存缓冲区需要1000个时钟周期,所以,对于像程序查询和中断等用软件实现输入输出的方式,CPU为每个字节传送所用的时间至少为 $1000\times 1\mathrm{ns} = 1000\mathrm{ns} = 1\mu \mathrm{s}$。在 $50\mathrm{kB / s}$ 的数据传输率下,设备每隔 $1\times 10^{6}\mu \mathrm{s} / (50\times 1000) = 20\mu \mathrm{s}$ 准备好一个字节,因而读取1000字节的时间为 $1000\times 20\mu \mathrm{s} = 20\mathrm{ms}$。

(1)定时查询方式下的I/O过程如图8.8所示。可以设置每隔20000ns查询一次,这样使得查询程序的开销达到最小,即第一次读取状态时就可能会发现就绪,然后用1000个时钟周期进行相应处理,因此,对于每个字节的传送,CPU所用时钟周期数为 $60 + 1000 = 1060$。因此,在1000字节的读取过程中,CPU用在该设备的I/O操作上的时间至少为 $1000\times 1060\times 1\mathrm{ns} = 1.060\mathrm{ms}$,占整个CPU时间的百分比至少为 $1.060 / 20 = 5.3\%$。

图8.8 定时查询方式下的I/O过程

(2)独占查询方式下的I/O过程如图8.9所示。启动设备后,CPU就开始查询,因为 $333 \times 60 + 20 = 20000$ ,所以第一个字节传送在第334次读取状态查询时检测到就绪,随后用1000个时钟周期进行相应的处理,然后继续第二个字节的状态查询,因为 $40 + 1000 + 316 \times 60 = 20000$ ,所以,第二个字节的传送在第316次读取状态查询时检测到就绪,第一个字节和第二个字节的传送过程如图8.9(a)所示。每次检测到就绪后,就进行相应的处理,然后周而复始地进行查询,因为 $20000 - 1000 / 60 = 316.7$ ,所以,第317次状态查询时发现就绪。因为 $1000 + 60 \times 317 - 20000 = 20$ ,所以,每三个字节可多60个时钟周期,正好进行一次状态查询,因此,在剩下的998字节的读取过程中,前996字节的传送正好用了 $996 \times 20000$ 个时钟周期,如图8.9(b)所示。最后两个字节的传送过程如图8.9(c)所示,因为 $2 \times (1000 + 60 \times 317 - 20000) = 40$ ,此外,最后一个字节的处理还有1000个时钟周期,所以最后两个字节总的时间为 $2 \times 20000 + 40 + 1000 = 41040$ 个时钟周期。综上所述,CPU用在该设备的I/O操作上的总时间为 $1000 \times 20000 + 1040 \times 1\mathrm{ns} = 20.00104\mathrm{ms} \approx 20\mathrm{ms}$ 。即在1000字节的整个传输过程中,CPU一直为该设备服务,所用时间占整个CPU时间的 $100\%$ 。

(3)中断方式下的I/O过程如图8.10所示。中断方式下,外设每准备好一个字节就请求一次中断,每次中断CPU所用时钟周期数为 $2 + 1200 = 1202$ ,因此CPU用在该设备的I/O操作上的时间为 $1000 \times 1202 \times 1\mathrm{ns} = 1.202\mathrm{ms}$ ,占整个CPU时间的百分比至少为 $1.202 / 20 = 6.01\%$ 。

(4)DMA方式下,由于CPU和DMA没有访存冲突,所以不需考虑由于DMA而影响到CPU执行其他程序。因此,传送1000字节CPU所用的时钟周期数就是2000,在1000字节的读取过程中,CPU用在该设备的I/O操作上的时间为 $2000\times 1\mathrm{ns} = 2\mu \mathrm{s}$ ,占整个CPU时间的百分比为 $2 / (1000\times 20) = 0.01\%$ 。


<!-- page: 279 -->

(a) 前两个字节的查询过程

(b) 中间996字节的查询过程

(c) 最后两个字节的查询过程

图8.9 独占查询方式下的I/O过程
图8.10 中断方式下的I/O过程

(5) 若设备数据传输率为  $5\mathrm{MB} / \mathrm{s}$ , 则外设传输 1000 字节所用时间为  $1000 \times 10^{6}\mu \mathrm{s} / (5 \times 10^{6}) = 200\mu \mathrm{s}$ 。

对于定时查询和独占查询方式,传送1000字节CPU所用时间至少为  $1000 \times (60 + 1000) \times 1\mathrm{ns} = 1060\mu \mathrm{s}$ ;对于中断方式,传送1000字节CPU所用时间为  $1000 \times (2 + 1200) \times 1\mathrm{ns} = 1202\mu \mathrm{s}$ 。上述三种方式下,CPU所用的时间都比设备所用时间长得多,也即设备的传输比CPU的处理快得多,因而发生数据丢失。因此,这三种方式都不能用于该设备的I/O操作。对于DMA方式,传送1000字节CPU所用时间为  $2000 \times 1\mathrm{ns} = 2\mu \mathrm{s}$ ,占整个CPU时间的百分比为  $2 / 200 = 1\%$  。说明可以使用DMA方式,不过由于外设传输速度加快,使得CPU频繁进行DMA预处理和后处理,因而,CPU的开销从  $0.01\%$  上升到了  $1\%$  。

(6) 对于字符型设备,在定时查询方式下,其数据传送过程如图 8.11 所示。CPU 可以每隔  $0.02\mathrm{ms}$  查询一次,这样总是在第一次查询时就发现就绪,马上启动设备进行下个字节的传送,并读取和处理当前字节。因此,传送 1000 字节 CPU 所用时间至少为  $1000 \times (1000 + 60) \times 1\mathrm{ns} = 1060\mu\mathrm{s} = 1.06\mathrm{ms}$ ,而设备传输 1000 字节所用时间为  $0.02\mathrm{ms} \times 1000 = 20\mathrm{ms}$ ,因此,占用 CPU 时间的百分比至少为  $1.06 / 20 = 5.3\%$ 。

在独占查询方式下,其数据传送过程如图8.12所示。第一个字节传送在第334次读取状态查询时检测到就绪,随后启动外设;在外设工作的同时,查询程序用1000个时钟周期进行相应的处理,然后周而复始地进行查询,因为  $20000 - 1000 / 60 = 316.7$ ,所以,对于后面的


<!-- page: 280 -->

图8.11 字符型设备定时查询方式下的I/O过程
第8章

999字节,每当进行到第317次状态查询时发现就绪;对于最后一个字节,外设就绪后CPU还需要1000个时钟对其进行处理。因此,在1000字节的读取过程中,CPU用在该设备的I/O操作的时间为 $(334\times 60 + 999\times (1000 + 60\times 317) + 1000)\times 1\mathrm{ns} = 20.02102\mathrm{ms}$ 。这种情况下,该设备的I/O操作占用CPU的时间为 $100\%$ 。

图8.12 字符型设备独占查询方式下的I/O过程

在中断方式下,其数据传送过程如图8.13所示。传送1000字节CPU所用时间为 $1.202\mathrm{ms}$ 。因为中断响应需2个时钟周期,并且中断服务程序执行了20条指令后开始启动外设,所以外设每次中断请求的时间间隔为 $(2 + 20\times 5)\times 1\mathrm{ns} + 20000\mathrm{ns} = 20102\mathrm{ns}$ ,传送1000字节所用时间为 $1000\times 20102\mathrm{ns} = 20.102\mathrm{ms}$ 。因此,中断方式下CPU占用时间的百分比约为 $1.202 / 20.102 = 5.98\%$ 。