I/O系统

I/O系统结构:

I/O管理:

应用程序若想访问磁盘上文件,要多经过文件系统,之后通过I/O设备管理来对相应的硬件进行操作。

I/O设备管理包括:

逻辑I/O,设备驱动程序,中断服务程序

 

I/O设备特点:

I/O性能经常成为系统性能的瓶颈

操作系统庞大复杂的原因之一:资源多、杂,并发,均来自I/O

与其他功能联系密切,特别是文件系统

 

设备分类:

块设备
以数据块为单位存储、传输信息

特点:
传输速率较高、可寻址(随机读写)
字符设备
以字符为单位存储、传输信息

特点:
传输速率低、不可寻址

 

I/O管理的目标和任务:

目标(1) 按照用户的请求,控制设备的各种操作,完成I/O设备与内存之间的数据交换,最终完成用户的I/O请求

任务:

  实现设备分配与回收

  记录设备的状态

  根据用户的请求和设备的类型,采用一定的分配算法,选择一条数据通路

  执行设备驱动程序,实现真正的I/O操作

  设备中断处理:处理外部设备的中断

  缓冲区管理:管理I/O缓冲区

目标(2) 建立方便统一的独立于设备的接口

方便性:向用户提供使用外
部设备的方便接口,使用户
编程时

统一性:对不同的设备采取
统一的操作方式,即在用户
程序中使用的是逻辑设备
    逻辑设备与物理设备
    屏蔽硬件细节

目标(3)

充分利用各种技术(通道,中断,缓冲,异步I/O等)提高CPU与设备、设备与设备之间的并行工作能力,充分利用资源,提高资源利用率

目标(4) 保护设备传送或管理的数据应该是安全的、不被破坏的、保密的

 

 

I/O硬件:

I/O设备一般由机械(设备本身)和电子(设备控制器)两部分组成

设备控制器作用:

(1)操作系统将命令写入控制器的接口寄存器(或接口缓冲区)中,以实现输入/输出,并从接口寄存器读取状态信息或结果信息

(2)当控制器接受一条命令后,可独立于CPU完成指定操作,CPU可以另外执行其他计算;命令完成时,控制器产生一个中断,CPU响应中断,控制转给操作系统;通过读控制器寄存器中的信息,获得操作结果和设备状态

(3)控制器与设备之间的接口常常是一个低级接口

(4)控制器的任务:把串行的位流转换为字节块,并进行必要的错误修正:首先,控制器按位进行组装,然后存入控制器内部的缓冲区中形成以字节为单位的块;在对块验证检查和并证明无错误时,再将它复制到内存中

 

I/O端口地址:

接口电路中每个寄存器具有的、唯一的地址,而且是个整数,所有I/O端口地址形成I/O端口空间(受到保护)

I/O指令形式与I/O地址是相互关联的, 主要有两种形式:
   内存映像编址(内存映像I/O模式)
   I/O独立编址(I/O专用指令)

内存镜像编址:

a,b,c代表三种不同的内存编址方式,最后一种应用了缓冲技术,即I/O端口地址映射到内存中某个区域。

分配给系统中所有端口的地址空间与内存的地址空间统一编址

把I/O端口看作一个存储单元,对I/O的读写操作等同于对内存的操作

优点:
  凡是可对内存操作的指令都可对I/O端口操作

  不需要专门的I/O指令

   I/O端口可占有较大的地址空间

   不需要特殊的保护机制来阻止用户进程执行I/O操作,但是OS必须保证那部分覅只空间不能分配给其他用户进程

   可以引用内存的每一条指令也可以引用控制寄存器

缺点:
   占用内存空间

 

I/O独立编址:

分配给系统中所有端口的地址空间完全独立与内存地址空间无关

使用专门的I/O指令对端口进行操作

优点

  外设不占用内存的地址空间,导致编程时易于区分是对内存操作还是对I/O端口操作

缺点:

  1.I/O端口操作的指令类型少,操作不灵活

           

           例子:在8086/8088中,分配给I/O端口的地址空间64K,0000H~0FFFFH,只能用in和out指令进行读写操作

2.对一个设备控制寄存器不能进行高速缓存

    例如:

        

LOOP:TEST PORT-4 //检测端口4是否为0
BEQ READY //如果为0,转向READY
BRANCH LOOP //否则,继续测试
READY:

第一次引用PORT_4将导致它被高速缓存,随后的引用将只从高速缓存中取值(因为端口已在cache中)并且不会再查询设备,之后当设备最终变为就绪时,软件将没有办法发现这一点,结果循环将永远进行下去,为避免这一情形,硬件必须针对每个页面具备选择性禁用高速缓存的能力,操作系统必须管理选择性高速缓存,所以这一特性为硬件和操作系统两者增添了额外的复杂性

 

I/O控制方式:

(1)可编程I/O(轮询/查询)
由CPU代表进程给I/O模块发I/O命令,进程进入忙等待,直到操作完成才继续执行

(2)中断驱动I/O
为了减少设备驱动程序不断地询问控制器状态寄存器的开销,I/O操作结束后,由设备控制器主动通知设备驱动程序

(3)DMA

对于可编程I/O:

过程:一个应用程序想从设备上读取数据,它会发送信息给设备驱动程序,设备驱动程序会检查设备状态,如果设备为空闲状态,再往设备发送控制命令,之后不断测试设备是否完成任务,完成后就把数据返回到应用程序

中断驱动I/O:

过程:

一个应用程序想从设备上读取数据,它会发送信息给设备驱动程序,设备驱动程序会检查设备状态,如果设备为空闲状态,再往设备发送控制命令,然后把设备状态记录在设备状态表中,若设备完成后就向CPU发送中断信号,CPU接收到该信号,就执行中断处理程序,若发现I/O设备本次操作正常,将CPU执行权再交给设备处理程序,其将设备中对应设备信息取出,发送给应用程序。

 

 I/O软件组成:

分层思想:

把I/O软件组织成多个层次

每一层都执行操作系统所需要的功能的一个相关子集,它依赖于更低一层所执行的更原始的功能,从而可以隐藏这些功能的细节;同时,它又给高一层提供服务

较低层考虑硬件的特性,并向较高层软件提供接口

较高层不依赖于硬件,并向用户提供一个友好的、清晰的、简单的、功能更强的接口

I/O软件层次:

(1)用户进程层执行输入输出系统调用,对I/O数据进行格式化,为假脱机输入/输出作准备

(2)独立于设备的软件实现设备的命名、设备的保护、成块处理、缓冲技术和设备分配

(3)设备驱动程序设置设备寄存器、检查设备的执行状态

(4)中断处理程序负责I/O完成时,唤醒设备驱动程序进程,进行中断处理

(5)硬件层实现物理I/O的操作

 

I/O相关技术:

缓冲技术的引入:

其是操作系统中最早引入的技术
  → 解决CPU与I/O设备之间速度的不匹配问题:凡是数据到达和离去速度不匹配的地方均可采用缓冲技术

       → 提高CPU与I/O设备之间的并行性

       → 减少了I/O设备对CPU的中断请求次数,放宽CPU对中断响应时间的要求

缓冲区分类:
硬缓冲:由硬件寄存器实现(例如:设备中设置的缓冲区)

软缓冲:在内存中开辟一个空间,用作缓冲区

缓冲区管理:

1.单缓冲
2.双缓冲
3.缓冲池(多缓冲,循环缓冲):统一管理多个缓冲区,采用有界缓冲区的生产者/消费者模型对缓冲池中的缓冲区进行循环使用

例如:终端输入软件中的键盘驱动程序其任务之一:收集字符,所使用的缓冲区

 

I/O设备管理:

有关的数据结构:

描述设备、控制器等部件的表格:系统中常常为每一个部件、每一台设备分别设置一张表格,常称为设备表或部件控制块。这类表格具体描述设备的类型、标识符、状态,以及当前使用者的进程标识符等
建立同类资源的队列:系统为了方便对I/O设备的分配管理,通常在设备表的基础上通过指针将相同物理属性的设备连成队列(称设备队列)
面向进程I/O请求的动态数据结构:每当进程发出I/O请求时,系统建立一张表格(称I/O请求包),将此次I/O请求的参数填入表中,同时也将该I/O有关的系统缓冲区地址等信息填入表中。I/O请求包随着I/O的完成而被删除
建立I/O队列:如请求包队列

独占设备的分配:

静态分配:

在进程运行前, 完成设备分配;运行结束时,收回设备

缺点:设备利用率低

动态分配:

在进程运行过程中,当用户提出设备要求时,进行分配,一旦停止使用立即收回

优点:效率好;

缺点:分配策略不好时, 产生死锁

分时式共享设备的分配:

1.所谓分时式共享就是以一次I/O为单位分时使用设备,不同进程的I/O操作请求以排队方式分时地占用设备进行I/O

2.由于同时有多个进程同时访问,且访问频繁,就会影响整个设备使用效率,影响系统效率。因此要考虑多个访问请求到达时服务的顺序,使平均服务时间越短越好

设备驱动程序:

1.与设备密切相关的代码放在设备驱动程序中,每个设备驱动程序处理一种设备类型
2.一般,设备驱动程序的任务是接收来自与设备无关的上层软件的抽象请求,并执行这个请求
3.每一个控制器都设有一个或多个设备寄存器,用来存放向设备发送的命令和参数。设备驱动程序负责释放这些命令,并监督它们正确执行
4.在设备驱动程序的进程释放一条或多条命令后,系统有两种处理方式,多数情况下,执行设备驱动程序的进程必须等待命令完成,这样,在命令开始执行后,它阻塞自已,直到中断处理时将它解除阻塞为止;而在其它情况下,命令执行不必延迟就很快完成

设备驱动程序与外界的接口:

1.与操作系统的接口:为实现设备无关性,设备作为特殊文件处理。用户的I/O请求、对命令的合法性检查以及参数处理在文件系统中完成。在需要各种设备执行具体操作时,通过相应数据结构转入不同的设备驱动程序

2.与系统引导的接口(初始化,包括分配数据结构,建立设备的请求队列)

3.与设备的接口

 驱动程序中函数:

驱动程序初始化函数(如向操作系统登记该驱动程序的接口函数,该初始化函数在系统启动时或驱动程序安装入内核时执行)

驱动程序卸载函数

申请设备函数

释放设备函数

I/O操作函数:对独占设备,包含启动I/O的指令;对共享设备,将I/O请求形成一个请求包,排到设备请求队列,如果请求队列空,则直接启动设备

中断处理函数:对I/O完成做善后处理,一般是唤醒等待刚完成I/O请求的阻塞进程,使其能进一步做后续工作;如果存在I/O请求队列,则启动下一个I/O请求

 

I/O进程:

专门处理系统中的I/O请求和I/O中断工作

I/O请求的进入
   用户程序:调用send将I/O请求发送给I/O进程;调用block将自己阻塞,直到I/O任务完成后被唤醒
   系统:利用wakeup唤醒I/O进程,完成用户所要求的I/O处理
I/O中断的进入
   当I/O中断发生时,内核中的中断处理程序发一条消息给I/O进程,由I/O进程负责判断并处理中断

对于I/O进程特点:

1.是系统进程,一般赋予最高优先级。一旦被唤醒,它可以很快抢占处理机投入运行
2.I/O进程开始运行后,首先关闭中断,然后用receive去接收消息

接收消息情况:

1.没有消息,则开中断,将自己阻塞

2.有消息,则判断消息类型(I/O请求或I/O中断)
  a. I/O请求
    准备通道程序,发出启动I/O指令,继续判断有无消息
  b. I/O中断,进一步判断正常或异常结束

   正常:唤醒要求进行I/O操作的进程

        异常:转入相应的错误处理程序

I/O性能:

为了使CPU利用率尽可能不被I/O降低,使CPU尽可能摆脱I/O,我们:

减少或缓解速度差距 使用 缓冲技术
使CPU不等待I/O 使用 异步I/O
让CPU摆脱I/O操作 使用 DMA、通道

 

异步传输(不要求立刻返回结果):

通过异步I/O,应用程序可以启动一个I/O操作,然后在I/O请求执行的同时继续处理
基本思想:填充I/O操作间等待的CPU时间

同步I/O(等待直到返回一个结果):

应用程序被阻塞直到I/O操作完成

 

 

      作者水平有限,文章肯定有错还请各位指点!!!感谢!!!

posted on 2017-07-28 22:20  chaunceyctx  阅读(1677)  评论(0编辑  收藏  举报

导航