I/O
系统是对外部设备的一个输入输出管理,I/O
是input/ouput
的缩写。
外部设备是指除了CPU
和存储器
之外的所有设备。
基本概念
外部设备中包含了两类:
- 存储设备:硬盘、磁带、光碟等
- I/O设备:鼠标、键盘、显示器、打印机等
统一编址:存储器和I/O
设备的统一编址在一个块,CPU通过load
和store
指令进行操作,对主存地址发出指令就是对读写,对I/O
地址发出指令就是向设备发出控制命令。
独立编址:设定专用的的I/O
指令对I/O
设备进行操作,根据CPU
发出的信号判断访问的I/O
设备地址。 读取主存就用主存指令,进行I/O就使用I/O指令。
地址 |
---|
主存空间 |
I/O空间,键盘、鼠标、显示器等各占一个位置 |
classDiagram
CPU -- 主存空间: 主存指令
CPU --|> IO设备: I/O指令
IO设备 --* 键盘
IO设备 --* 鼠标
IO设备 --* 显示器
IO设备 --* 等
轮询:由程序员进行在代码判断是否有事件发生,若是有事情发送就处理事情。
中断:由操作系统实现中断传输数据,数据量小没问题,但是数据量大的情况,会出现大问题,因为中断嵌套,一个I/O
进来就是一个中断,I/O
没有完成就又来一个I/O
,造成无限套娃
DMA:DMA进行传输数据,CPU
把主存地址、I/O
地址、数据长度、什么时候开始传输等信息发给DMA
,DMA
根据CPU
的信息开始数据传输,虽然节省了传输时间,但是CPU
依然要寻找数据地址,寻找放置数据的主存地址等操作。
sequenceDiagram
participant 主存
participant CPU
participant I/O设备
loop 读取I/O数据
I/O设备-->>CPU:取数据
CPU-->>主存:存数据
end
loop 写入I/O数据
主存-->>CPU:取数据
CPU-->>I/O设备:存数据
end
有DMA后传输数据
sequenceDiagram
participant CPU
participant DMA
participant 主存
participant I/O设备
loop 读取I/O数据
CPU->>DMA: 发送主存地址,I/O地址,数据长度、什么时候开始传输等信息
I/O设备-->>DMA:读取数据
DMA-->>主存:传输数据
DMA->>CPU: 我读取好了
end
loop 写入I/O数据
CPU->>DMA: 发送主存地址,I/O地址,数据长度、什么时候开始传等信息
主存-->>DMA:读取数据
DMA-->>I/O设备:传输数据
DMA->>CPU: 我读取好了
end
通道
通道程序是由硬件实现,拥有自己的一套I/O
指令,通过接收CPU
的请求,对数据进行传输。
相当于CPU
从自己身体分离了一个小弟,专门干I/O
的事情。
通道的功能:
- 接收
CPU
的请求,并根据指令要求选择指定外设和通道相连接 - 执行通道程序,从主存取出通道指令,进行译码,向设备控制器发出操作命令
- 给出读写操作的数据所在地址:磁盘存储器的柱面号、磁头号、扇区等。
- 寻找主存的首地址,该缓冲区存放从外设读取数据或者将要输出到外设的数据
- 控制外设与主存缓冲区之间的数据传输,对传送的数据进行计数,由此判断是否完成。
- 指定传输结束后要进行的操作:中断请求及通道中断请求送往
CPU
等 - 检查外设是否正常,并将该状态信息送往主存指定单元保存
- 对传输的数据进行格式转换,如:比特流转换成字节,把字节转换为字等
sequenceDiagram
participant CPU
participant 通道
participant 主存
participant I/O设备控制器
CPU->>通道: 帮我把硬盘的数据导入一下
主存-->>通道: 取出通道指令,进行译码
通道->>I/O设备控制器: 搜索数据所在地址
通道->>主存: 搜索主存空闲的位置,返回首地址
I/O设备控制器-->>通道: 读取数据
通道-->>主存: 写入数据
通道->>CPU: 发送中断:数据导入完成,返回导入数据所在的主存地址。