第七章 输入/输出系统

7.2 I/O接口

I/O接口是主机和外设之间的交接界面,通过接口可以实现主机和外设之间的信息交换。
主机和外设在信息形式和工作速度上有很大的差异,接口可以解决这些问题。

7.2.1 I/O接口的功能

要解决的问题:

(1)进行地址码和设备选择
(2)实现主机和外设的信息联络控制
(3)实现数据缓冲
(4)信号格式的转换
(5)传送控制命令和状态信息

具体操作:

(1)设备选址
(2)传送命令
(3)传送数据
(4)反映I/O设备的工作状态

I/O接口的职能(袁书补充)

(1)数据缓冲
(2)错误和状态监测
(3)控制和定时
(4)数据格式转换
(5)与主机和设备通信

7.2.2 I/O接口的基本结构

在这里插入图片描述
具体部分的功能:
1、内部接口:与系统总线相连,实质上与内存、CPU相连。数据的传输方式只能是并行传输
2、外部接口:与接口电缆和外设相连。可能是串行传输,也可能是并行传输。
a)并行传输:多用于同步总线上。
b)串行传输:异步串行通信协议
3、设备选择电路:设备选址
4、命令寄存器和命令译码器:传送命令
5、数据缓冲寄存器(DBR):传送数据和数据格式转化。
6、设备状态标记:反映设备状态。
7、CPU同外设之间的信息传送实质上:对接口中的某些寄存器(端口)进行读和写。
8、数据线:
a)DBR与内存、CPU的寄存器的传送
b)状态寄存器与CPU实现设备状态信息的传送
c)CPU与控制寄存器实现对外设的控制信息的传送
9、地址线:给出要访问IO接口中寄存器的地址
10、控制线:
a)控制信号,也可能参与地址编码,如用读信号确定是接收寄存器还是发送寄存器
b)仲裁信号和握手信号

注意:
1、CPU对外设的控制命令也通过数据线传输,一般将其传送到I/O接口的控制寄存器。状态寄存器和控制寄存器在传送方向是相反的。
2、接口中的地址线用于给出要访问的I/O接口中的寄存器地址。它和读写控制信号一起被传送到I/O接口的控制逻辑部件,通过控制线传来的读写信号确定是读还是写寄存器。此外控制线还会传送一些仲裁信号和握手信号。
3、接口中的I/O控制逻辑还能对控制寄存器中的命令字进行编码,并将编码得到的控制信号通过外设界面控制逻辑送到外设,同时将数据缓冲寄存器中的内容发送到外设或者从外设接收数据到数据缓冲寄存器。此外,还有能够收集外设状态到状态寄存器。
4、I/O指令只能在操作系统内核的底层I/O软件中使用,是一种特权指令。

**接口和端口的区别:
1、端口是接口电路中可以进行读写的寄存器
2、若干的端口加上相应的控制逻辑就可以组成接口
**

7.2.3 I/O接口的类型

1、按数据传输方式:
a)并行接口:一字节或者一个字的所有位同时传送
b)串行接口:一位一位传送
2、按主机访问I/O设备的控制方式:
a)程序查询接口
b)中断接口
c)DMA接口
3、按功能选择的灵活性:
a)可编程接口
b)不可编程接口

7.2.4 I/O端口及其编址

I/O端口:数据端口、状态端口、控制端口
通常CPU能对
1、数据端口:读写
2、状态端口:读
3、控制端口:写

编址方法

I/O端口如果想被CPU访问,那么必须要对端口编号,每个端口对应一个端口地址。

1、统一编址

把I/P端口当成存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口。
在这里插入图片描述

优点:不需要专门的输入输出指令,可以使得CPU访问I/O更加灵活、更方便,还可以使端口有较大的编址空间。

缺点:端口占用了存储器地址,使内存容量变小,而且利用存储器编址的I/O设备进行数据输入输出操作,执行速度较慢。

2、独立编址

端口地址与存储器地址无关,独立编址CPU需要专门的输入输出指令访问端口,又称I/O映射方式。
在这里插入图片描述

靠不同的指令区分内存和I/O设备

优点:输入输出指令与存储指令有明显的差别,程序编制清晰,便于理解。

缺点:输出指令少,一般只能对端口进行传送操作,尤其需要CPU提供存储器读/写两组控制信号,增加了控制的复杂性。

课后习题知识补充

1、统一编址下,可以直接访问I/O设备
2、只有在具有专门I/O指令的计算机中,I/O设备才可以单独编址
3、在统一编址的情况下,I/O设备对应的I/O地址要求相对固定在地址的某一部分
4、磁盘驱动器向盘片磁道记录数据时采用串行方式写入。
5、在I/O总线的数据线上,传输的信息包括:I/O接口中的命令字,I/O接口中的状态字,中断类型号。
6、磁盘驱动器不属于I/O接口。
(I/O接口即I/O控制器,主要是接收主机发送的I/O控制信号,并且实现主机和外部设备之间的信息交换。)
7、打印机适配器、网络控制器、可编程中断控制器都属于I/O接口
8、I/O指令实现数据传送通常发生在:通用寄存器和I/O端口之间。
CPU使用地址总线确定I/O端口,使用数据总线在通用寄存器和I/O端口之间传输数据。

7.3 I/O方式

常见I/O方式:程序查询,程序中断,DMA,通道。

7.3.1程序查询方式

信息交换的方式完全由CPU执行程序实现。
程序查询方式接口中有数据缓冲寄存器(数据端口)设备状态寄存器(状态端口) 主机进行I/O操作时,先发出询问信号,读取设备状态并根据设备状态决定下一步操作是进行数据传送还是等待。

工作流程如下:
1、CPU初始化程序,预置传送参数
2、向I/O接口发出命令字,启动I/O设备
3、从外设接口读取其状态信息
4、CPU不断查询I/O设备状态,直到外设准备就绪
5、传送一次数据
6、修改地址和计数器参数
7、判断传送是否结束,若未结束跳转到3、,直到计数器为0

流程图如下:
在这里插入图片描述

CPU一旦启动I/O,必须停止现行程序的运行,并在现行程序中插入一段程序。
寄存器与DBR交换单位为1个字。

袁书补充:两种程序直接控制方式
1、无条件传送方式:
处理器对外设接口进行周期性的定时访问,直接对IO端口进行数据存取。

由于对于高速设备,定时访问的时间间隔较短,频繁进行IO设备的访问,因而这种方式不宜用于高速设备的IO

2、条件传送方式/异步传送方式:
查询程序中安排相应的IO指令,由这些指令直接从IO接口中获得外设和接口的状态,根据这些状态来控制外设和主机的信息交换。

根据查询方式的不同:定时查询和独占查询。

对于键盘的鼠标这种随即启动的低速IO设备,由于用户畅抒己见没有输入,而引起查询程序长时间等待,减低处理器的处理效率,因而多采用中断的方式。

像磁盘、磁带和光盘存储器等成块传送设备一旦被启动,便一直传送数据,不需要处理器对每个数据传送启动,并且数据的传送时间很短,不适合程序查询方式。

对于针式打印机这种,可以采用程序查询方式。

7.3.2程序中断方式

程序中断方式的思想:

CPU在程序中安排好在某个时刻启动某台外设,然后CPU继续执行当前的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时终止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设的数据传送,传送完成之后,CPU返回原来的程序。

程序中断的工作流程:
1、中断请求:

中断源是请求CPU中断的设备或者事件,一台计算机有多个中断源。中断源向CPU发送中断请求信号。

2、中断响应判优:

中断响应判优是指CPU响应中断请求的先后顺序。通常是由硬件排队器(可以设置在CPU中,也可以分布在各个中断源中 ) 实现的。(也可以通过软件实现__通过查询程序实现的)
一般来说:
1、不可屏蔽中断 > 内部异常 >可屏蔽中断
2、内部异常中:硬件故障 > 软件中断
3、DMA中断请求优先于IO设备传送的中断请求
4、在IO传送类中断请求中,高速设备优先于低俗设备;输入设备优先于输出设备;实时设备优先于普通设备

中断优先级包括响应优先级和处理优先级。响应优先级在硬件线路上的固定的,不便改动;处理优先级可以利用中断屏蔽技术来动态调整,以便实现多重中断。
中断响应优先级:由查询程序或者吋间盘有排队线路决定的优先权,反映的是多个中断同时请求时,哪个被先响应。
中断处理优先级:根据各自中断屏蔽字对中断优先权进行动态分配。

中断响应的时间:
1、断点保存的时间
2、中断源识别和判优的时间
3、获得中断服务程序首地址和初始状态的时间

3、CPU响应中断的条件:

(1)中断源有中断请求
(2)CPU允许中断并且开中断(异常和不可屏蔽中断不受这个限制)
(3)一条指令执行完毕(异常不受此限制)并且没有更紧急的任务。

IO设备的就绪事件是随机的,CPU在统一的时刻即每条指令 执行阶段结束前 向接口发出中断查询信号。
CPU响应中断的时间为:每条指令执行阶段的结束时刻,这里的中断仅仅是IO中断,内部异常不属于这一类。

4、中断响应过程:

CPU响应中断——中断隐指令(硬件实现)——中断服务程序。

中断隐指令操作:

1、关中断。CPU响应中断之后,首先要保护程序断点和现场信息。在此过程中不能响应优先级更高的中断请求。
2、保存断点。要将原程序的断点(指令无法直接读取的PC和PSW的内容)保存在栈或者特定寄存器中。
注意异常和中断的差异:
异常指令通常没有执行成功,所以其断点是当前指令的地址。
中断的断点式下一条指令的地址。

3、引出中断服务程序。要对应的服务程序入口地址送到程序计数器PC。
有两种方法识别中断源:硬件向量法和软件查询法。

5、中断向量:

中断识别分为:向量中断、非向量中断(软件查询法)。
每个中断都有唯一一个类型号(通过识别中断源得到),每个类型号对应一个中断服务程序,每个中断服务程序对应一个入口地址,CPU必须找到入口地址,即中断向量。
将系统中的全部中断向量集中放到存储器的某个区域,这个存放中断向量的区域就是中断向量表。

CPU响应中断之后,通过识别中断源获取中断类型号,根据这个计算出对应中断向量的地址;根据该地址从中断向量表中获取中断服务程序的入口地址,并且送入PC中,然后转而执行中断服务程序。这个称为中断向量法。

6、中断处理过程。

**1、关中断
2、保存断点
3、中断服务程序寻址
4、保存现场和屏蔽字
5、开中断
6、执行中断服务程序
7、关中断
8、恢复现场和屏蔽字
9、开中断
**

其中1-3由中断隐指令完成,4-9由中断服务程序完成。

多重中断功能应满足:
1、中断服务程序中要提前设置开中断指令
2、优先级别高的中断源有券中断优先级别低的中断源

中断处理优先级:可以利用中断屏蔽技术动态调整优先级,从而可以灵活地调整中断优先级。如果不使用中断屏蔽技术,那么处理优先级和响应优先级相同。
在这里插入图片描述

7.3.3 DMA方式

DMA方式完全由硬件进行成组信息传送的控制方式,具有程序中断方式的优点:在数据准备阶段,CPU与外设并行工作。DMA方式在外设和内存之间开辟一条“直接数据通道”,信息传送不再经过CPU,降低了CPU在传送数据的开销,因此称为直接存储器存取方式。由于传送数据不再经过CPU,那么就不需要保护、恢复CPU现场等繁琐的操作。

DMA方式中,中断的作用仅限于故障和正常传送结束时的处理。

在DMA方式中,当IO设备需要进行数据传输时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后让出系统总线,由DMA控制器接管总线进行数据传输。

1、DMA方式的特点

1、使得主存与CPU的固定联系脱钩,主存既可以被CPU访问,又可以被外设访问。
2、在数据块传送时,主存地址的确定、传送数据的计数等都可以被硬件电路直接实现。
3、主存中要开辟专用缓冲区,及时供给和接收外设的数据
4、DMA传送速度极快,CPU与外设并行工作,提高了系统的效率
5、DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。

2、DMA控制器组成
DMA控制器的主要功能:

1、接收外设发出的DMA请求,并向CPU发出总线请求
2、CPU响应此总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期
3、确定传送数据的主存单元地址及长度,并主动修改主存地址计数和传送长度计数
4、规定数据在主存和外设之间的传送方向,发出读写控制信号,执行数据传送操作。
5、向CPU报告DMA操作结束

简单DMA控制器

1、主存地址计数器:存放要交换数据的主存地址
2、传送长度计数器:记录传送数据的长度,计数溢出时,数据即传送完毕,自动发中断请求信号。
3、数据缓冲寄存器:暂存每次传送的数据
4、DMA请求触发器:每当IO设备准备好数据后,给出一个控制信号,使DMA请求触发器置位
5、控制/状态逻辑:由控制和时序电路及状态标志组成,用于规定传送方向,修改传送参数,对DMA请求信号,CPU响应信号进行协调和同步
6、中断机构:当一个数据块传送完毕之后出发中断机构,向CPU提出中断请求
在这里插入图片描述

在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号将被禁止使用。

3、DMA传送方式

当IO设备和CPU同时访问主存时,可能发生冲突,因此DMA控制器与CPU通常采用:
(1)停止CPU访存
(2)周期挪用(或周期窃取)。
1、CPU正在访存时,DMA要访存,那么CPU在存取周期结束之后让出总线。
2、IO访存的优先级高于CPU访存,因为IO不立即访存就可能发生数据丢失,此时由IO设备挪用1个或者多个存取周期,传送完一个数据后立即释放总线,是一种单字传送方式。

(3)DMA与CPU交替访存。这种方式适用于CPU的工作周期比主存存取周期长的情况

4、DMA传送过程

1、预处理(CPU)
首先CPU执行几条IO指令,用以测试IO设备状态;然后,CPU继续执行原来的程序,直到IO设备准备好发送的数据或者接收的数据时,IO设备向DMA控制器发送DMA请求。
2、数据传送(DMA)
3、后处理(CPU)
(1)检验送入主存的数据是否正确
(2)测试传送过程中是否出错,错则转入诊断程序
(3)决定是否使用DMA传送其他数据块

在这里插入图片描述

5、DMA方式与中断方式的区别

1、中断是程序的切换,需要保护和恢复现场;
DMA方式除了预处理和后处理,其他时候不占用CPU资源
2、对中断请求的响应只能发生在每条指令执行完毕的时候(指令的执行周期之后);
DMA请求的响应可以发生在每个机器周期结束时(取指周期,间址周期、执行周期后均可),只要CPU不占用总线就可以被响应
3、中断传送过程需要CPU的干预;
DMA传送过程不需要CPU干预,因此传送效率很高,适合于高速外设的成组数据传送
4、DMA请求的优先级高于中断请求
5、中断方式具有对异常事件的处理能力,而DMA方式仅仅局限于传送数据块的DMA操作
6、中断方式靠程序传送,DMA方式靠硬件传送。

课后习题知识点补充:

1、中断服务程序一般是操作系统模块
中断向量方法可以提高中断源的识别速度
中断向量是中断服务程序的入口地址,中断向量地址是内存中存放中断向量的地址
2、当有中断源发出请求时,CPU可以执行相应的中断服务程序,能够提出中断的有:外部事件、虚拟存储器失效、浮点数运算上溢(待补充)
3、程序中断方式的中断请求完全是为了传输数据;
DMA方式的中断请求是为了报告CPU数据的传送结束
4、每条指令周期结束后,CPU会统一扫描各个中断源,然后进行判优来决定响应哪个中断源。
CPU会在每个存储周期结束后检查是否有DMA请求。
中断服务程序的最后指令是中断返回指令,与无条件转移指令不同的是,不仅要修改PC值,而且要讲CPU中所有的寄存器都恢复到中断前的状态。
5、能够产生DMA请求的总线部件:具有DMA接口的设备
6、中断响应由高到低的优先次序宜用:访管-程序性-重新启动
7、可能产生中断请求:DMA周期结束、机器出现故障、执行“软中断”指令;一条指令的执行完毕可能响应中断请求,但是它本身不会引起中断请求
8、用户程序需要输入/输出时,需要调用OS提供的接口(请求操作系统服务),此时会引起访管中断,系统由用户态转为核心态。
9、中断隐指令不再指令系统中,不属于程序控制指令
10、在中断响应周期中,CPU主要完成中断隐指令
11、中断响应周期中,中断触发器置0表示关中断,由中断隐指令完成,硬件自动完成。
12、通过设置中断屏蔽位可以改变:多个中断服务程序执行完的次序
13、在各种IO方式中,中断方式的特点:CPU与外设并行工作,传送与主程序串行工作
DMA方式的特点:CPU与外设并行工作,传送与主程序并行工作
14、DMA方式只是在DMA前处理和后处理需要用中断的方式请求CPU操作,但是在数据传送的过程中,并不需要中断请求。
15、每个机器周期结束后,CPU就可以响应DMA请求。
注意:DMA在与主存交互数据时候通过周期窃取方式,窃取的事存取周期
16、中断请求的响应时间只能发生在每条指令执行完毕。
如果不开中断,内中断和非屏蔽中断仍可响应,
17、DMA方式只能用于数据传输,不具有对异常事件的处理能力,不能中断现行程序,而键盘和鼠标均要求CPU立即响应,因此无法使用DMA方式。
18、程序控制方式:直接程序传送、程序中断、通道控制
DMA由于是靠硬件电路实现,因此不属于程序控制方式。
19、外部中断:是指CPU执行指令以外的中断,通常来自CPU与内存之外的中断
键盘输入:外部中断
除数为0:属于异常,内中断
浮点数运算下溢:按机器零处理,不会产生中断
访存缺页:属于CPU执行指令时产生的中断
定时器到时:外部中断
网络数据包到达:外部中断
20、中断IO方式请求的是CPU处理时间,DMA方式请求的是总线使用权
中断响应发生在一条指令执行结束之后,DMA响应发生在一个总线事物完成后
中断IO方式下数据传送通过软件完成,DMA方式数据传送通过硬件完成
21、CPU响应中断时,通用寄存器的保护由中断服务程序完成
22、DMA传送前由设备驱动程序传送参数
23、通过INTR线发出的外中断是可屏蔽中断,通过NMI线发出的外中断是不可屏蔽中断。不可屏蔽中断即使在关中断(IF = 0)情况下也会被响应。
24、周期挪用法是由DMA挪用一个或者几个主存周期来访存,传送完一个数据字之后立即释放总线,是一种单字传送方式,每个字传送完之后CPU可以访问主存。
停止CPU访存法是指在整个数据块的传送过程中,使CPU脱离总线,停止访问主存。
25、中断服务程序在内核态下执行,若只能在用户态检测和响应中断,则显然无法实现多重中断。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是使用 LinkedList 和 ArrayList 集合实现的 KTV 点歌系统的 Java 代码: ```java import java.util.LinkedList; import java.util.ArrayList; import java.util.Scanner; public class KTVSystem { public static void main(String[] args) { LinkedList<String> songList1 = new LinkedList<>(); // 使用 LinkedList 集合实现 ArrayList<String> songList2 = new ArrayList<>(); // 使用 ArrayList 集合实现 Scanner sc = new Scanner(System.in); songList1.add("稻香"); songList1.add("夜曲"); songList1.add("夜的第七章"); songList1.add("听妈妈的话"); songList1.add("龙卷风"); songList2.add("稻香"); songList2.add("夜曲"); songList2.add("夜的第七章"); songList2.add("听妈妈的话"); songList2.add("龙卷风"); while (true) { System.out.println("请选择操作:0-添加歌曲;1-将歌曲置顶;2-将歌曲前移一位;3-退出"); int option = sc.nextInt(); if (option == 0) { System.out.println("请输入要添加的歌曲名称:"); String song = sc.next(); songList1.add(song); songList2.add(song); System.out.println("已添加歌曲:" + song); System.out.println("当前歌曲列表(LinkedList):" + songList1); System.out.println("当前歌曲列表(ArrayList):" + songList2); } else if (option == 1) { System.out.println("请输入要置顶的歌曲名称:"); String song = sc.next(); if (songList1.remove(song)) { songList1.addFirst(song); System.out.println("已将歌曲" + song + "置顶(LinkedList)"); } else { System.out.println("歌曲" + song + "不存在!"); } if (songList2.remove(song)) { songList2.add(0, song); System.out.println("已将歌曲" + song + "置顶(ArrayList)"); } else { System.out.println("歌曲" + song + "不存在!"); } System.out.println("当前歌曲列表(LinkedList):" + songList1); System.out.println("当前歌曲列表(ArrayList):" + songList2); } else if (option == 2) { System.out.println("请输入要置前的歌曲名称:"); String song = sc.next(); int index1 = songList1.indexOf(song); int index2 = songList2.indexOf(song); if (index1 != -1) { songList1.remove(index1); songList1.add(index1 - 1, song); System.out.println("已将歌曲" + song + "置前一位(LinkedList)"); } else { System.out.println("歌曲" + song + "不存在!"); } if (index2 != -1) { songList2.remove(index2); songList2.add(index2 - 1, song); System.out.println("已将歌曲" + song + "置前一位(ArrayList)"); } else { System.out.println("歌曲" + song + "不存在!"); } System.out.println("当前歌曲列表(LinkedList):" + songList1); System.out.println("当前歌曲列表(ArrayList):" + songList2); } else if (option == 3) { System.out.println("已退出系统。"); break; } else { System.out.println("无效指令!"); } } } } ``` 注意,上述代码中的 LinkedList 和 ArrayList 集合都存储了相同的歌曲列表,因此添加、置顶和置前操作都同时在两个集合上进行,并在每次操作后都输出当前的歌曲列表,方便查看。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾尔伯特想变瘦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值