OS-5.1 I/O管理简述
IO设备的分类

按使用特性分类:
- 人机交互类IO
- 存储设备
- 网络通信设备
按传输速率分类:
- 低速设备(eg鼠标,键盘)
- 中速设备(eg激光打印机)
- 高速设备(eg移动硬盘)
按信息交换设备的单位分类:
- 块设备:数据传输基本单位是 “ 块 ”,(传输速率高,可寻址)
- 字符设备:数据传输的基本单位是 字符(传输慢,不可寻址,常采用中断驱动方式)
按共享属性分类:
- 独占设备:(静态分配方式)
- 共享设备:必须是可寻址,可随机访问的设备哦。(动态分配方式)
- 虚拟设备:将独占设备改造成多个逻辑设备

IO接口 / IO控制器
==IO设备的组成:==
机械部件:用来执行具体IO操作(eg键盘,LED显示屏)
电子部件:实现CPU对IO设备的控制。就是**==IO控制器==**。
==IO控制器是CPU和IO设备连接的桥梁==
IO控制器功能

IO控制器的组成
- ①CPU与控制器之间的接口。(接口包括三类数据线)
- ②IO逻辑。(用于实现对设备的控制)
- ③控制器与设备之间的接口。(每个接口可传输三类信号)


IO接口的类型
- 按数据传输方式:并行接口,串行接口。
- 按主机访问设备的控制方式:程序查询接口,中断接口,DMA接口。
- 按功能灵活性 :可编程接口,不可编程接口。
- 按设备类型的不同:字符设备接口,块设备接口,网络设备接口。
IO端口
IO端口是设备控制器中可被CPU访问的寄存器,主要有三类。
- 数据寄存器
- 状态寄存器
- 控制寄存器
为了使CPU能够访问IO端口,需对各端口进行编址,有两种编址方式:独立编址,统一编址。
统一编址(内存映射方式) VS 寄存器独立编址(IO映射方式)

回顾

IO控制方式(4)
– 即用什么样的方式来控制IO设备的数据读/写

程序直接控制方式
Key:CPU==轮询==(控制器状态,IO好了没,好了就能够拿到数据了)



中断驱动方式
引入了==中断==机制。
中断驱动方式的工作流程
因为IO设备速度慢,所以当CPU发出读写命令后,将等待的IO进程阻塞,切换别的进程执行。
当IO完成后,控制器会主动向CPU发出一个中断信号。当CPU检测到中断信号,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。【在每个指令周期的末尾,CPU都会检查中断信号】
处理中断的过程中,CPU从IO控制器读一个字的数据传送到CPU寄存器,再写入主存。==【即由中断服务程序完成数据的输入和输出】==
接着,CPU恢复等待IO的进程(或其他进程)的运行环境,继续执行。
优点:CPU和IO设备可以并行工作。
缺点:每次执行只转存一个字,大量中断会消耗CPU时间。(中断处理需要保存恢复进程的运行环境,是有一定时间开销的。)

==DMA(直接存储器存取 )==
在IO设备和内存之间建立直接数据通路。
DMA不是处理机,是一个控制器。
CPU给DMA发出一条命令,同时设置DMA控制器中寄存器的值(来启动DMA)。(值包括:CPU所取数据的地址和长度)
DMA也会使进程阻塞!CPU和数据传送并行。
改进:
- 数据的传送单位是 “ 块 ”,不是一个字的传送了。(so:DMA主要用于块设备)
- 数据传输的块必须是连续的,即传送一块或者连续多块。
- 数据的流向是设备→内存 ,或者内存→设备。(不需要中转站CPU了)
- 仅在预处理和后处理阶段,才需要CPU干预。
==DMA工作过程==
- 预处理阶段:由CPU初始化DMA控制器中有关寄存器等等。
- 数据传输阶段:把数据从外设(eg硬盘)搬到内存。(由DMA控制器负责)
- 后处理阶段:DMA向CPU发送中断请求(表示事情做完了!)。CPU执行中断服务程序做DMA结束处理。
DMA==控制器==中有4类寄存器:
- 命令/状态寄存器
- 内存地址寄存器
- 数据寄存器
- 数据计数器

DMA方式的工作流程
1 | CPU收到设备DMA请求后,向DMA控制器发送启动命令,并设置MAR和DC的初值,随后启动DMA控制器。 |

通道
是一种硬件,可以理解为 “ 小CPU ”。
通道可以识别并执行一系列通道指令。
CPU仅需向通道发送一条IO指令,指明目标设备 及 通道程序在内存中的起始地址。
CPU,通道和IO设备可以高效地并行工作。
通道控制设备控制器,设备控制器控制设备工作。(CPU要么向通道发出命令,要么直接给设备控制器发出命令)


DMA VS 通道
- CPU仅需指明目标设备 及 通道程序在内存中的起始地址。通道能自主完成涉及多设备多阶段的复杂IO。
- 每个DMA控制器仅服务于一台设备。一个通道可同时管理多台设备和内存的数据交换。
==回顾==

IO软件层次结构(4)

用户层软件
向上:实现与用户交互的接口。
向下:通过“系统调用”请求OS内核服务。
将二进制整数转化为ASCII码的格式打印,是通过IO库函数实现的,属于用户层软件。

==设备独立性软件==
– 又叫设备无关性软件
==设备独立性==:用户使用设备的透明性。即使用户编程时使用的 逻辑设备 和 实际使用的 物理设备 无关。
目的:①实现各类设备的公共操作。②为上层提供统一、抽象的IO接口。
- 向上层提供统一调用的接口。
- 提供对设备的保护。
- 实现差错处理。
- 实现设备的分配与回收
- 实现数据缓存区管理。
- 建立逻辑设备到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序。
逻辑设备表

==设备驱动程序 – IO!==
不同 品牌的设备 需要不同的驱动程序→品牌厂家需提供与设备相对应的驱动程序。(eg打印机)
不同的 系统 也需要不同的驱动程序→驱动程序也需根据操作系统的要求进行定制。
不同的 IO 方式 也需要不同的驱动程序。
Q:判断是不是设备驱动程序要做的:看看功能是否会因为 IO硬件 的不同而不同==!==
EG:计算磁盘所在的磁盘柱面号的程序。
主要任务:
- ==接受上层软件发出的 抽象IO请求(如read命令),将其转换为 设备控制器 能够识别的 具体操作,==
- ==之后发送给(写入到)设备控制器,控制设备工作。==
==工作过程==
- ① 将抽象要求转化为具体要求(才能被设备控制器识别)
- ② 对服务请求进行校验(是否可执行)
- ③ 检查设备的状态(设备是否就绪)
- ④ 传送必要的IO参数
- ⑤ 启动IO设备
中断处理程序

回顾
- 没有涉及硬件,对各种设备都需要进行管理的工作,都是在==设备独立性软件层==完成的。
- 直接涉及到硬件具体细节、且与中断无关的操作,肯定是在==设备驱动程序层==完成的。

IO应用程序接口 & 设备驱动接口

输入输出应用程序接口
字符设备:不可“寻址”。每次读一个字符。
块设备:可以“寻址”,每次读写一个块。

阻塞IO:应用程序发出IO系统调用,进程需转为阻塞态等待。
- eg字符设备接口 – 从键盘读一个字符get
非阻塞IO:应用程序发出IO系统调用,系统调用可快速返回,进程无需转为阻塞态等待。
- 块设备接口 – 往磁盘写数据write
设备驱动程序接口
没统一标准的设备驱动程序接口

统一标准的设备驱动程序接口

other
中断处理结束后,是否回到被中断的进程:看是单重中断还是多重中断哦。
中断服务程序(是硬件!)
键盘是典型的通过中断方式工作的IO外设。
