操作系统—IO设备

IO设备

按使用特性分类

  • 人机交互类外设:键盘、鼠标
  • 存储设备:磁盘
  • 网络通讯设备:网络接口啥的

按传输速率分类

  • 低速设备:每秒一个或几个字节,如键盘等等
  • 中速设备:每秒数千个字节,如打印机等等
  • 高速设备:几千兆字节,如磁带机

按信息交换的单位分类

  • 块设备:如磁盘,其特征是传输效率高,以及可寻址,即可以随机读写任意一块,换句话说类似数组随机读取指定索引
  • 字符设备:如打印机,效率低下,不可寻址,输入输出采用中断机制

IO控制方式

1、程序中断控制方法

cpu发起io指令,cpu一直等着io读取完毕,数据没准备好需要空等,也就是阻塞,数据准备好了也需要cpu去搬运,很明显,cpu和io的效率是天差地别,这个时候cpu利用率很低

2、中断驱动方法

cpu发起读命令,保存当前运气程序的上下文,转而去执行其他程序,每个指令末尾,cpu检查下中断是否发生

如果有那么保存现在执行程序的上下文,去执行之前那个程序。

虽然比程序中断法牛逼了点,在数据没有准备好,cpu不会空等,但由于每个字在存储器和IO设备之间传输都要经过cpu,即把数据传输进内存也是要cpu控制,每个指令还需要查看中断其实还是效率不高

3、DMA

首先DMA由这几个部分组成

  • 命令/状态寄存器:接收cpu发来的控制信息,或设备状态
  • 内存地址寄存器:输入时候,存放数据放入内存的起始地址
  • 数据寄存器:暂存设备到内存,内存到设备的数据
  • 数据计数器:存放本次传送的字节数

DMA方式的特点

  • 按块传输
  • 设备到内存,内存到设备
  • 一个或多个数据块开始,结束才需要cpu干预,块的传输是在DMA控制下

cpu发起io请求,把这个io请求给DMA,然后继续工作,DMA在内存和设备之间传输数据,不需要cpu参与,传输完成后给中断信号,只有开始和结束cpu才需要参与,而且传输数据无需cpu参与

4、通道控制方法

通道和DMA主要区别是,DMA需要cpu控制传输数据块大小,内存位置,而通道控制方法中都是由通道控制

一个通道可以控制多台设备,DMA只能一个

通道可以一次性读取一组数据块,DMA是一个数据块

举例子分析

程序控制:cpu轮询的去io这边看下,是否准备好数据

中断控制:io每次准备好一部分数据,就给cpu一个中断信号,然后让cpu从它哪里拿到内存中去

DMA:cpu找了个仆人DMA,交代好数据放在内存哪里,这次要传输的数据块大小,io把数据准备好就通知DMA,让DMA去拿到内存中去,每次处理好这次数据就给cpu一个信号

通道控制:cpu的这个仆人更加牛逼了,他能绝定数据放内存哪里,一次传输多少数据,报告时间也由它觉得,是传输了20%报告还是100%报告随它。而且它可以与多个设备交换

IO子系统的层次结构

用户层IO软件
设备独立软件
设备驱动软件
中断处理软件
硬件

- 用户io软件:实现和用户交换接口
- 设备独立软件:实现用户程序和设备驱动器的统一接口,设备命令,设备保护及设备分配与释放
- 设备驱动软件:和硬件相关,负责具体实现系统对设备发出的操作指令
- 中断处理软件;用于处理中断相关
- 硬件设备:包括一个机械部件(设备本身)和一个电子部件(控制器)

举个例子

上面太抽象了,得来个具体例子

当Java读取文件的时候,会通过操作系统系统的read命令接口,这就是用户层

操作系统的接口是统一接口,不管事socket还是文件系统read都能通过这个接口调用,首先通过设备独立层进行解析,这层类似于分发的作用,分发给不同的设备驱动软件

因为是操作磁盘读取,那么磁盘接收read和socket(网卡)接收read是会做出不同动作的,这层就是设备驱动层

然后就是执行read命令,需要中断指令,这就是中断处理软件

最后到了硬件也就是磁盘,硬件设备的控制器按照上层传达的命令操控硬件完成功能,这里是硬件层