一、前言
I/O系统是OS的重要组成部分,完成用户提出I/O的请求。
二、I/O系统
I/O软件的层次结构:(1)用户层I/O软件,实现与用户交互的接口。(2)设备独立性软件,实现用户程序与设备驱动程序的统一接口。(3)设备驱动程序,与硬件直接相关,用于具体实现系统对设备发出的操作命令。(4)中断处理程序,用户保存cpu环境,转入相应的中断处理程序,处理完毕之后再恢复被中断进程的现场,返回被中断的进程。I/O系统中包括I/O系统接口和软件/硬件接口。I/O系统接口主要用于高层与I/O系统的接口,软件/硬件接口主要用于中断处理程序和用于不同设备的设备驱动程序。
三、I/O设备与设备控制器
3.1设备
分为块设备和字符设备、独占设备和共享设备、高速和低速设备。
设备与控制器之间的接口,数据信号线,控制信号线和状态信号线。
3.2设备控制器
设备控制器应具有以下功能:接收和识别命令,执行处理器发来的命令;数据交换;标识和识别设备的状态;地址识别;数据缓冲区;差错控制。
设备控制器组成:(1)设备控制器与处理机的接口:用于实现cpu与设备控制器的通信。(2)设备控制器与设备的接口:设备控制器可以连接多个设备。(3)I/O逻辑:用于实现对设备的控制。
3.3内存映像I/O
驱动程序将抽象I/O命令转换出一系列具体的命令、参数等数据装入设备控制器的相应寄存器,由控制器来执行这些命令。
3.4I/O通道
通道为了减少cpu与I/O设备的负担,在主机配置多个外设时,cpu的负担仍然很重。通道类型:字节多路通道、数组选择通道、数组多路选择通道。
四、中断结构与处理程序
4.1中断
中断是指cpu对I/O设备发来的中断信号的一种相应。
陷入是指cpu内部事件所引起的中断。中断向量表,由中断控制器确定请求中断的中断号,根据中断号寻找中继向量表,从中取得中断处理程序的入口地址。中断存在优先级的区别。当多个中断源发出中断时,系统可以采取两种策略,一种是屏蔽中断,一种是嵌套中断。
4.2中断处理程序
(1)测定是否有未响应的中断信号。(2)保护中断进程的cpu环境。(3)转入相应的设备处理程序。(4)中断处理(5)恢复cpu现场并退出中断。
五、设备驱动程序
设备驱动程序的处理过程:
(1)将抽象要求转换为具体要求(2)对服务请求进行校验(3)检查设备状态(4)传送必要的参数(5)启动I/O设备对I/O设备的控制方式:(1)轮询可编程的I/O方式(2)使用中断的可编程方式(3)直接存储器访问方式(4)I/O通道控制方式
六、与设备无关的I/O软件
6.1设备分配的数据结构
(1)设备控制表(2)控制器控制表(3)通道控制表(4)系统设备表
6.2独占设备的分配程序
(1)分配设备(2)分配控制器(3)分配通道
6.3逻辑设备表
用于进行逻辑设备名到物理设备名的映射。包含逻辑设备名、物理设备名和设备驱动程序的入口地址。
七、用户层I/O软件
SPOOLing 系统主要有以下三部分:(1) 输入井和输出井。这是在磁盘上开辟的两个大存储空间。输入井是模拟脱机输入时 的磁盘设备,用于暂存 I/O 设备输入的数据;输出井是模拟脱机输出时的磁盘,用于暂存用 户程序的输出数据。(2) 输入缓冲区和输出缓冲区。为了缓和 CPU 和磁盘之间速度不匹配的矛盾,在内存 中要开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的 数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送给输 出设备。(3) 输入进程 SPi和输出进程 SPo。这里利用两个进程来模拟脱机 I/O 时的外围控制机。 其中,进程 SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区 再送到输入井,当 CPU 需要输入数据时,直接从输入井读入内存;进程 SPo模拟脱机输出 时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将 输出井中的数据经过输出缓冲区送到输出设备上。
八、缓冲区管理
缓冲区的引入(1)缓和cpu与I/O速度不匹配的矛盾。(2)减少对cpu的中断频率,放宽中断相应时间的限制。(3)解决数据粒度不匹配的问题。(4)提高cpu与I/O设备的并行度。循环缓冲区:(1) Getbuf 过程。当计算进程要使用缓冲区中的数据时,可调用 Getbuf 过程。该过程 将由指针 Nextg 所指示的缓冲区提供给进程使用,相应地,须把它改为现行工作缓冲区, 并令 Current 指针指向该缓冲区的第一个单元,同 时 将 Nextg 移向下一个 G 缓冲区。类 似 地 , 每 当 输入进程要使用空缓冲区来装入数据时,也调用 Getbuf 过程,由该过程将指针 Nexti 所指示的缓冲区提供给输入进程使用,同时将 Nexti 指针移向下一个 R 缓冲区。(2) Releasebuf 过程。当计算进程把 C 缓冲区中的数据提取完毕时,便调用 Releasebuf 过程,将缓冲区 C 释放。此时,把该缓冲区由当前(现行)工作缓冲区 C 改为空缓冲区 R。类 似地,当输入进程把缓冲区装满时,也应调用 Releasebuf 过程,将该缓冲区释放,并改为 G 缓冲区。缓冲区的构成:(1) 空缓冲队列 emq。这是由空缓冲区所链成的队列。其队首指针 F(emq)和队尾指针 L(emq)分别指向该队列的首缓冲区和尾缓冲区。(2) 输入队列 inq。这是由装满输入数据的缓冲区所链成的队列。其队首指针 F(inq)和 队尾指针 L(inq)分别指向该队列的首缓冲区和尾缓冲区。(3) 输出队列 outq。这是由装满输出数据的缓冲区所链成的队列。其队首指针 F(outq)和 队尾指针 L(outq)分别指向该队列的首缓冲区和尾缓冲区缓冲区的使用方式:(1) 收容输入。在输入进程需要输入数据时,便调用 Getbuf(emq)过程,从空缓冲队列 emq 的队首摘下一空缓冲区,把它作为收容输入工作缓冲区 hin。然后,把数据输入其中, 装满后再调用 Putbuf(inq,hin)过程,将该缓冲区挂在输入队列 inq 上。(2) 提取输入。当计算进程需要输入数据时,调用 Getbuf(inq)过程,从输入队列 inq 的 队首取得一个缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用 完该数据后,再调用 Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列 emq 上。(3) 收容输出。当计算进程需要输出时,调用 Getbuf(emq)过程从空缓冲队列 emq 的队 首取得一个空缓冲区,作为收容输出工作缓冲区 hout。当其中装满输出数据后,又调用 Putbuf(outq,hout)过程,将该缓冲区挂在 outq 末尾。(4) 提取输出。由输出进程调用 Getbuf(outq)过程,从输出队列的队首取得一装满输出 数据的缓冲区,作为提取输出工作缓冲区 sout。在数据提取完后,再调用 Putbuf(emq,sout) 过程,将该缓冲区挂在空缓冲队列末尾
九、磁盘存储器
- 先来先服务(FCFS,First Come First Served) :先来先服务原则
- 最短寻道时间优先(SSTF,Shortest Seek Time First) :下一次寻道是寻找离当前位置距离最短的,会出现饥饿现象。
- SCAN 算法:自里向外然后自外向里。
- 循环扫描(CSCAN)算法 :到达最外层磁道时,返回最靠里的磁道执行。
- NStepSCAN 算法 :分为多个长度为N的请求子队列。
- FSCAN 算法 :分为两个请求队列。
版权声明:本文为u010807583原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。