输入输出系统
注:为方便书写,文中所有的IO都代表I/O
IO系统的功能、模型和接口
IO软件的层次
- 用户层软件:产生IO请求、格式化IO、Spolling
- 设备独立性软件:映射、保护、分块、缓冲、分配
- 设备驱动程序:设置设备寄存器;检查状态
- 中断处理程序
- 硬件:执行IO操作
IO系统的模型
IO设备和设备控制器
即硬件部分
IO设备一般由两部分组成:
- 机械部分
- 电子部分
IO设备的类型:(不同分类标准)
输入设备、输出设备、交互式设备
低速设备(键盘、鼠标)、中速设备(打印机)、高速设备(磁盘、光盘)
数据传输单位:块设备、流设备
共享属性:独占设备、共享设备
硬件部分的通信方式:设备和设备控制器通信、设备控制器和CPU通信
IO设备和设备控制器之间通过三种类型信号通信:
- 数据信号线
- 状态信号线
- 控制信号线
CPU和设备控制器之间通过三种类型信号通信:
- 数据信号线
- 地址信号线(通知设备控制器需要开启哪个设备,因为一台设备控制器有可能连接多台同类型的设备)
- 控制信号线
IO通道——CPU的新替身
IO通道不仅可以接收CPU传来的命令进行译码执行,也可以通过访问内存,取指执行,特点如下:
- 能够执行的指令类型单一——仅限于IO指令
- 没有自己的内存,和CPU共享内存
IO通道的类型:
- 字节多路通道
- 数组选择通道
- 数组多路通道
中断机构和中断处理程序
- 中断在操作系统中有着特殊重要的地位
- 是进程切换的重要技术
外中断和内中断
-
外中断(中断):中断由外部设备引起
-
内中断(陷入):中断来源于CPU内部
中断向量表:
序号 | 中断处理程序入口 |
---|---|
1 | 0x11234 |
… | … |
中断信号到来时,中断控制器(硬件)确定中断号,再去调用相应的处理程序
处理中断具有不同的优先级,因此对多源中断产生了两种处理方式:
- 屏蔽(禁止)中断——不让插队
- 嵌套中断——让插队
设备驱动程序
中断是IO结束的时候用的,驱动则主要是IO启动时用的。
驱动程序是IO系统的高层和设备控制器之间的通信程序,其需要接收抽象的IO指令,例如read或者write,然后将其转换为适合改硬件的具体指令和参数,发送给设备控制器。
设备驱动程序和一般应用/系统程序的不同
- 仅转换IO相关操作
- 和硬件紧密关联,同类终端可以共享一个驱动
- 驱动程序与IO采用的控制方式相关,一般为中断驱动或者DMA方式
- 和硬件紧密相关,因此一部分是汇编语言,固化在ROM中
- 允许可重入,正在运行的驱动程序常会在一次调用完成前再次被调用
设备驱动程序的处理过程
- 将抽象要求转换为具体要求(e.g. 磁盘,需要将逻辑地址转换为盘号、磁道号和扇区号)
- 对服务请求进行校验,检查用户请求的合理性(e.g. 从打印机读入数据是不合理的)
- 检查设备的状态。启动IO设备前,该设备应该是就绪状态,需要检查设备控制器的状态寄存器;如果不是,则阻塞进程到该设备的等待队列上。
- 传送参数
- 启动IO设备,传送指令
- 将自己阻塞,等待设备IO结束后的中断信号再被唤醒
驱动程序中最重要的技术:对IO设备的控制方式
- 程序控制方式
- 中断驱动方式
- DMA方式
- IO通道控制方式
程序控制方式(轮询的可编程IO方式):
- CPU发出一条IO指令启动输入设备输入数据时,要同时令状态寄存器中的忙/闲标志busy置1,并循环检查busy的值。(CPU总要一直检查busy的值,需要额外的开销)
- 当busy=1时,表示尚未完成一个字(符)的输入,此时CPU应继续对busy进行检查,直至busy=0,表明已完成数据的输入。
- 于是,CPU将数据寄存器中的数据取出,送入内存中,这样便完成了一个字(符)的IO。
- 接着再去启动读下一个数据,并置busy=1,如此反复下去
中断驱动方式(中断的可编程IO方式):
- 进程要启动IO设备工作时,由CPU向该设备控制器发出一条IO命令,然后便可以立即返回继续执行原来的任务。
- 设备控制器按照命令要求去控制指定设备。此时,CPU与IO设备并行操作。
- 设备处理完数据后,便产生一个中断信号。此时,CPU转而处理该信号。
特点:在IO设备处理每个数据的过程中,由于无需CPU干预,因而可使CPU与IO设备并行工作。仅当处理完一个数据时,才需CPU花费极短的时间去做中断处理。但对于块设备,如果有100个字,则需要中断100次。
DMA方式(直接存储器方式):
- 传输的基本单位——数据块。CPU与IO设备之间每次传送至少一个数据块。
- 所传送的数据从设备直接送入内存,或者相反。
- 仅在传送一个或多个数据块的开始和结束时,才需CPU干预。传送是在控制器的控制下完成的。
- DMA方式较之中断驱动方式,又成百倍地减少了CPU对IO的干预,进一步提高了CPU与IO设备的并行程度。
- 从磁盘读入数据块时,CPU将一条读指令送至磁盘控制器的命令寄存器(CR)中
- 将数据读入的内存起始目标地址送入内存地址寄存器(MAR)中;将读数据的字(节)数送入数据计数器(DC)中
- 将磁盘的源地址送至DMA控制器的IO逻辑中。
- 启动DMA控制器进行数据传送,CPU便可以去处理其他任务。
- 此后,整个数据传送过程便由DMA控制器进行控制。
- 当DMA控制器已从磁盘读入一个字(节)的数据并送入数据寄存器(DR)后,将该字(节)传送到指定的内存单元中。
- 接着便对MAR内容加1,将DC内容减1.
- 若减1后DC内容不为0,表示传送未完,便继续传送下一个字(节);
- 否则,由DMA控制器发出中断请求。
IO通道控制方式:
是DMA方式的发展,把对一个数据块的读写,改为对一组数据块的读写。
通道程序包含:
- 操作码
- 内存地址
- 计数
- 通道程序结束位P
- 记录结束标志R
e.g.
操作 | P | R | 计数 | 内存地址 |
---|---|---|---|---|
Write | 0 | 0 | 80 | 813 |
Write | 0 | 0 | 140 | 1034 |
Write | 0 | 1 | 60 | 5830 |
Write | 0 | 1 | 300 | 2000 |
Write | 0 | 0 | 250 | 1850 |
Write | 1 | 1 | 250 | 720 |
多条指令操作的内存写到一起,通过R的值来识别(R=1代表这组数据块的结束);通道程序的最后一条指令通过P来识别
与设备无关的IO软件
与设备无关的含义:应用程序中所用的设备,不必局限于使用某个具体的物理设备
与设备无关的IO软件在驱动之上,也称为设备独立性软件。
功能:
- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 对独立设备的分配与回收
- 独立于设备的逻辑数据块
4个数据结构:
- 设备控制表DCT
- 控制器控制表COCT
- 通道控制表CHCT
- 系统设备表SDT
设备控制表:
设备控制表(DCT) |
---|
设备类型 |
设备标识符 |
设备状态 |
指向控制器表的指针 |
重复执行次数或时间 |
设备队列的队首指针 |
控制器控制表:
控制器控制表(COCT) |
---|
控制器标识符 |
控制器状态 |
指向通道表的指针 |
控制器队列的队首指针 |
控制器队列的队尾指针 |
通道控制表:
通道控制表(CHCT) |
---|
通道标识符 |
通道状态 |
与通道连接的控制器表首址 |
通道队列的队首指针 |
通道队列的队尾指针 |
系统设备表:
物理设备的分配过程:物理设备名→SDT→DCT→COCT→CHCT
设备分配时需要考虑的因素
- 设备的固有属性(独占设备、共享设备)
- 设备的分配算法(先来先服务、优先级高者优先)
- 设备分配中的安全性(安全分配方式、不安全分配方式)
用户层的IO软件
用户层的IO软件:包括帮助用户进程实现系统调用的库函数和假脱机系统。
假脱机技术可以将一台物理IO设备虚拟为多台逻辑IO设备,这样也就允许多个用户共享物理IO设备。
假脱机系统:
其中的输入井和输出井是在硬盘上分出的空间进行数据存储。
Spooling系统(假脱机系统)的优势:
- 提高IO的速度
- 将独占设备改为共享设备
- 实现了虚拟设备功能
缓冲区管理
为什么引入缓冲区?
- 缓解CPU和IO设备速度不匹配的矛盾
- 减少对CPU的中断频率
- 解决数据粒度不匹配的问题
- 提高CPU和IO设备的并行性
单缓冲区:每当用户申请IO的时候,OS就给该用户分配一个缓冲区
双缓冲区:每当用户申请IO的时候,OS就给该用户分配两个缓冲区,也叫缓冲对换
双机通讯时的双缓冲区设置
也可以采用环形缓冲区:多个缓冲区形成唤醒的数据结构,类似生产者消费者问题
emq - empty queue
inq - in queue
ouq - out queue
收容输入:
Getbuf(emq);
Putbuf(inq, hin);
提取输入:
Getbuf(inq);
Putbuf(emq, sin);
收容输出:
Getbuf(emq);
Putbuf(ouq, hout);
提取输出:
Getbuf(ouq);
Putbuf(emq, sout);
磁盘存储器的性能和调度
磁盘调度算法:
- 先来先服务(FCFS)
- 最短寻道时间优先(SSTF)-要求访问的磁道与当前所在磁道之间的距离最短
- 扫描算法(SCAN)-在SSTF的基础上,要求考虑磁头的移动方向(会调转方向)
- 循环扫描算法(CSCAN)-磁头只朝一个方向移动