操作系统-IO系统

一、前言

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) 过程,将该缓冲区挂在空缓冲队列末尾

九、磁盘存储器

  1. 先来先服务(FCFS,First Come First Served) :先来先服务原则
  2. 最短寻道时间优先(SSTF,Shortest Seek Time First) :下一次寻道是寻找离当前位置距离最短的,会出现饥饿现象。
  3. SCAN 算法:自里向外然后自外向里。 
  4. 循环扫描(CSCAN)算法 :到达最外层磁道时,返回最靠里的磁道执行。
  5.  NStepSCAN 算法 :分为多个长度为N的请求子队列。
  6.  FSCAN 算法 :分为两个请求队列。





版权声明:本文为u010807583原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。