操作系统—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命令,需要中断指令,这就是中断处理软件
最后到了硬件也就是磁盘,硬件设备的控制器按照上层传达的命令操控硬件完成功能,这里是硬件层