I/O输入系统
前言
写完这一章,笔记就要告一段落了。接下来一周主攻毕业设计。希望毕设可以有一个超级起步。
这一章虽然以前学过,但是真的是没什么印象了。
一、概述
对与计算机相连设备的控制是操作系统设计者的主要任务之一。因为I/O设备在其功能与速度方面存在很大的差异,所以需要采用多种方法来控制设备。这些方法形成了I/O子系统的核心,该子系统使内核其他部分不必涉及复杂的I/O设备管理。
I/O设备技术呈现两个相矛盾的趋势:
- 一方面,可以看到硬件与软件接口日益增长的标准化。这一趋势有助于将设备集成到现有计算机和操作系统。
- 另一方面,也可以看到I/O设备日益增长的多样性。有的新设备与以前的设备区别很大,以至于很难集成到计算机和操作系统中,这种困难需要运用软件技术和硬件技术一起来解决。
一般的解决方法:
- I/O设备的基本要素如端口、总线和设备控制器适用于许多不同的I/O设备。为了封装不同设备的细节和特点,操作系统内核设计成使用设备驱动程序模块的结构。设备驱动程序为I/O子系统提供了统一设备访问接口,就像系统调用为应用程序和操作系统之间提供了统一的标准接口一样。
二、I/O硬件
总线: 是一组线和一组严格定义的可以描述在线上传输信息的协议。
控制器: 是用于操作端口、总线或设备的一组电子器件。
一个典型的PC总线结构:
处理器如何向控制器发送命令和数据以完成I/O传输?
- 控制器可以有一个或多个用于数据和控制信号寄存器。处理器通过读写这些寄存器的位模式来与控制器通信。这种通信的一种方法是通过使用特殊I/O指令来向指定的I/O端口地址传输一个字节或字。
- 设备控制器也可支持内存映射I/O。这时,设备控制寄存器被映射到处理器的地址空间。处理器执行I/O请求是通过标准数据传输指令来完成对设备控制器的读写。
I/O端口通常有四种寄存器:
- 状态寄存器: 包含一些主机可以读取的位(bit)。这些位指示各种状态,例如,当前任务是否完成,数据输入寄存器是否有数据可以读取,是否出现设备故障等。
- 控制寄存器: 可以被主机用来向设备发送命令或改变设备状态。
- 数据输入寄存器: 被主机读出以获取数据。
- 数据输出寄存器: 被主机写入以发送数据。
下面都是讲主机如何与I/O进行交互的协议或硬件支持
1. 轮询
控制器有1bit来显示其状态,主机的命令寄存器有1bit就绪位来显示其状态。控制器工作忙时就置忙位,而可以接收下一命令时就清忙位。主机通过命令寄存器中命令就绪位来表示其意愿。当主机有命令需要控制器执行时,就置命令就绪位。
具体握手协议如下:
- 主机不断地读取忙位,直到该位被清除。
- 主机设置命令寄存器中的写位并向数据输出寄存器中写入一个字节。
- 主机设置命令就绪位。
- 当控制器注意到命令就绪位以被设置,则设置忙位。
- 控制器读取命令寄存器,并看到写命令。它从数据输出寄存器中读取一个字节,并向设备执行I/O操作。
在步骤1中,主机处于忙等待或轮询。
2. 中断
中断在第一章提到过,在这里。
3. 直接内存访问(DMA)
DMA需要硬件支持,称为直接内存访问(direct-memory access)控制器。
DMA具体传输步骤:
三、I/O应用接口
1. 块与字符设备
块设备:
- 命令包括read, write, seek。
- 访问方式包括生I/O,直接I/O和内存映射。
字符设备:
- 命令包括get,put。
- 可以构造库以提供具有缓冲和编辑功能的按行访问。
2. 网络设备
比如Socket接口。
3. 时钟与定时器
- 可以获取当前时间,逝去的时间。
- 可以设置定时器,在T是触发操作X。
- 测量逝去时间和触发操作的硬件称为可编程间隔定时器,它可被设置为等待一定时间,然后触发中断。
4. 阻塞与非阻塞I/O
阻塞IO: 指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态。传统的IO模型都是同步阻塞IO。在Java中,默认创建的socket都是阻塞的。
**非阻塞IO:**指的是用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户操作,即处于非阻塞的状态,与此同时内核会立即返回给用户一个状态值。
简单来说:阻塞是指用户空间(调用线程)一直在等待,而不能干别的事情;非阻塞是指用户空间(调用线程)拿到内核返回的状态值就返回自己的空间,IO操作可以干就干,不可以干就去干别的事情。
四、I/O内核子系统
1. I/O调度
调度一组I/O就是确定一个合适的顺序来执行这些请求。应用程勋发布的系统调用顺序不一定总是最佳选择,调度能改善系统整体性能,如磁盘调度,重新安排服务顺序增加性能就是I/O调度的核心。
操作系统开发人员通过为每个设备维护一个请求队列来实现调度。
2. 缓冲
3. 高速缓存
4. 假脱机
目的: 解决独占设备的并发访问问题以提高设备利用率。
假脱机是用来保存设备输出的缓冲区,这些设备不能接收交叉的数据流。比如,应用程序的输出先是假脱机到一个独立的磁盘文件上,当应用程序完成打印时,假脱机系统将对应的待送打印机的脱机文件进行排队。
五、把I/O操作转换成硬件操作
如图: