一、I/O 管理概述

1.1 I/O 控制方式

1、程序直接控制方式

计算机从外部设备读取数据到存储器,每次读一个字的数据

对读入的每个字,CPU 需要对外设状态进行循环检查直到确定该字已经在 I/O 控制器的数据寄存器中

2、中断驱动方式

允许 I/O 设备主动打断 CPU 的运行并请求服务,从而“解放” CPU,使得设备向 I/O 控制器发送读命令后可以继续做其他有用的工作

3、DMA(直接存储器)方式

在 I/O 设备和内存之间开辟直接的数据交换通路,彻底“解放” CPU

特点:

  • 基本单位是数据块
  • 数据从设备直接送入内存,或者相反
  • 仅在传送一个或多个数据块的开始和结束时才需 CPU 干预,整块数据的传送在 DMA 控制器的控制下完成

为了在主机与控制器之间实现成块数据的直接交换,必须在 DMA 控制器中设置如下4类寄存器:

  • 命令/状态寄存器(CR)。接收从 CPU 发来的 I/O 命令,或有关控制信息,或设备的状态
  • 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址
  • 数据寄存器(DR)。暂存从设备到内存或从内存到设备的数据
  • 数据计数器(DC)。存放本次要传送的字(节)数

4、通道控制方式

I/O 通道是指专门负责输入/输出的处理器,是 DMA 方式的发展,能够进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预

I/O 通道与一般处理器的区别:通道指令类型单一且没有自己的内存;通道所执行的通道程序是放在主机内存中的,即通道与 CPU 共享内存

I/O 通道与 DMA 方式的区别:DMA 方式需要 CPU 控制传输的数据块大小、传输的内存位置,而通道方式中这些信息由通道控制。另外,每个 DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换

1.2 I/O 软件层次结构

整个 I/O系统可以视为具有5个层次的系统结构,如图

各层次及其功能如下:

  1. 用户层 I/O 软件。实现与用户交互的接口,用户可直接调用在用户层提供的、与 I/O 操作有关的库函数,对设备进行操作
  2. 设备独立性软件。用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间
  3. 设备驱动程序。与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序
  4. 中断处理程序。用于保护被中断进程的 CPU 环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断程序
  5. 硬件设备。I/O 设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开。电子部件称为设备控制器(或适配器),机械部件则是设备本身

二、I/O 核心子系统

I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制

这些方法共同组成了操作系统内核的 I/O子系统,它将内核的其他方面从繁重的 I/O设备管理中解放出来

I/O核心子系统提供的服务主要有:I/O调度、缓冲与高速缓存、设备分配与回收、假脱机等

2.1 I/O 调度概念

I/O调度就是确定一个好的顺序执行 I/O请求

应用程序发布的系统调用顺序不一定总是最佳选择,需要 I/O调度来改善系统整体性能,使进程之间公平地共享设备访问,减少输入输出所需要的平均等待时间

通过为每个设备维护一个请求队列来实现调度:当一个应用程序执行阻塞 I/O系统调用时,该请求就加到相应设备的队列上,I/O调度会重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间

I/O子系统还可以使用主存或磁盘上的存储空间的技术,如缓冲、高速缓存、假脱机等来改善计算机效率

2.2高速缓存与缓冲区

1、磁盘高速缓存(Disk Cache)

操作系统使用磁盘高速缓存技术来提高磁盘的 I/O速度,对高速缓存数据的访问要比对原始数据的访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到 CPU的二级和一级高速缓存中

磁盘高速缓存技术不同于通常意义下的介于 CPU与内存之间的小容量高速存储器,而是利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓逻辑上属于磁盘,物理上则是驻留在内存中的盘块

高速缓存在内存中分为两种形式:

  • 内存中开辟一个单独的存储空间作为磁盘高速缓存,大小固定
  • 把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘 I/O 时共享

2、缓冲区(Buffer)

在设备管理子系统中引入缓冲区的目的:

  1. 缓和 CPU与 I/O设备间速度不匹配的矛盾

  2. 减少对 CPU的中断频率,放宽对 CPU中断响应时间的限制

  3. 解决基本数据单元大小(即数据粒度)不匹配的问题

  4. 提高 CPU和 I/O设备之间的并行性

其实现方法有:

  1. 采用硬件缓冲器,但由于成本太高,只有一些关键部件使用
  2. 采用缓冲区(位于内存区域)

缓冲区有一个特点,当缓冲区的数据非空的时候,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出

根据系统设置缓冲器的个数,缓冲技术可以分为:

1)单缓冲

在设备和处理器之间设置一个缓冲区,设备和处理器交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机再从缓冲区取走数据

在块设备进行输入时,假定从磁盘把一块数据输入到缓冲区的时间为 T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,而 CPU对这一块数据处理的时间为 C

若 T > C,从初始状态开始,当工作区数据处理完后,时间为 C,缓冲区还没冲满,当缓冲区冲满时,时间为 T,停止再冲入数据。然后缓冲区向工作区传送数据,当工作区满了以后,缓冲区的数据同时也为空,用时为 M,到达下一个开销状态,整个过程用时 M + T

若 T < C,同理,整个过程用时 M + C

所以单缓冲区处理每块数据用时为 Max(C, T) + M

2)双缓冲

根据单缓冲的特点,CPU在传送时间 M内处于空闲状态,由此引入双缓冲

I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理器可以从缓冲区1中取出数据放入用户进程处理,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理器又从缓冲区2中取出数据放入用户进程处理,而 I/O设备又可以装填缓冲区1。注意,必须等缓冲区2充满才能让处理器从缓冲区2取出数据

双缓冲机制提高了处理机和输入设备的并行操作程度

3)循环缓冲

包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形

循环缓冲用于输入/输出时,还需要有两个指针 in和 out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区并提取其中的数据,out指针指向可以提取数据的第一个满缓冲区。输出则正好相反

4)缓冲池

由多个系统的公用缓冲区组成

缓冲区按其使用状况可以形成三个队列:

  • 空缓冲队列
  • 装满输入数据的缓冲队列(输入队列)
  • 装满输出数据的缓冲队列(输出队列)

缓冲区分为四种:

  • 用于收容输入数据的工作缓冲区
  • 用于提取输入数据的工作缓冲区
  • 用于收容输出数据的工作缓冲区
  • 用于提取输出数据的工作缓冲区

如图所示

当输入进程需要输入数据时,便从空缓冲队列的队首取得一个空缓冲区作为收容输入工作缓冲区,然后把输入数据输入其中,装满后再将它挂到输入队列队尾

当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾

当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区作为收容输出工作缓冲区,当其中装满输出数据后,再将它挂到输出队列队尾

当输出进程需要输出数据时,从输出队列中取得一个装满输出数据的缓冲区作为提取输出工作缓冲区,当数据提取完后,再将它挂到空缓冲队列的队尾

3、高速缓存与缓冲区对比

区别 高速缓存 缓冲区
存放数据 存放的是低速设备上某些数据的复制数据,即高速缓存上有的低速设备上面必须有 存放的是低速设备传递给高速设备的数据(或者相反),而这些数据在低速设备(或高速设备)却不一定有备份,这些数据再从缓冲区传送到高速设备(或者低速设备)
目的 高速缓存存放的是高速设备经常要访问的数据,如果高速设备要访问的数据不在高速缓存中,高速设备就需要访问低速设备 高速设备和低速设备的通信都要经过缓冲区,高速设备永远不会直接去访问低速设备

2.3设备分配与回收

1、设备分配概念
设备分配是指根据用户的 I/O请求分配所需的设备

总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁

从设备的特性可分为以下三种:

  1. 独占式使用设备。 在申请设备时,如果设备空闲就将其独占,不再允许其他进程申请使用,一直等到该设备被释放才允许其他进程申请使用
  2. 分时式共享使用设备。 独占式使用设备设备利用率很低,当设备没有独占使用的要求时,可以通过分时共享使用提高利用率
  3. 以假脱机方式使用外部设备。实质上是对 I/O操作进行批处理,以空间换取时间;请求分页系统中的页面调度算法是以时间换空间

2、设备分配的数据机构

设备分配依据的主要数据结构有设备控制表 (DCT) 、控制器控制表 (COCT) 、通道控制表 (CHCT) 和系统设备表(SDT)

各数据机构功能:

一个设备控制表只表征一个设备,这个控制表中的表项就是设备的各个属性

每个设备分为机械部件和电子部件两部分,其中负责解析上层传达的命令并控制解析部件运作的是电子部件(控制器)。每个设备控制表都需要一个表项来表示控制器,也就是指向控制器控制表

整个系统只有一张系统设备表。它记录已连接到系统中的所有物理设备的情况,每个物理设备占一个表目

由于多道程序系统中进程数多于资源数,会引起资源的竞争。因此要有一套合理的分配原则,主要考虑的因素有:I/O设备的固有属性、I/O设备的分配算法、I/O设备分配的安全性以及I/O设备的独立性

3、设备分配的策略

①设备分配原则

设备分配应根据设备特性、用户要求和系统配置情况

分配的总原则:既要充分发挥设备的使用效率,又要避免造成死锁,还要将用户程序和具体设备隔离开

②设备分配方式

设备分配方式有静态分配和动态分配两种

静态分配主要用于对独占设备的分配。在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器(如通道等)。一旦分配后,这些设备、控制器(和通道)就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低,不符合分配的总原则

动态分配是在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,系统按照事先规定的策略给进程分配所需要的设备、I/O控制器,用完之后立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法使用不当,则有可能造成进程死锁

③设备分配算法

常用的动态设备分配算法有先请求先分配、优先级高者优先等

独占设备既可以用动态分配方式也可以采用静态分配方式,往往采用静态分配方式。共享设备可被多个进程所共享,一般采用动态分配方式,但在每个 I/O传输的单位时间内只被一个进程所占有,通常采用先请求先分配和优先级高者优先的分配算法

4、设备分配的安全性

设备分配的安全性是指设备分配中应防止发生进程死锁

①安全分配方式

每当进程发出 I/O请求后便进入阻塞状态,直到其 I/O操作完成时才被唤醒。这样进程已经获得某种设备后便阻塞,不能再请求任何资源,而且阻塞时也不保持任何资源

优点:设备分配安全。缺点:CPU和 I/O设备是串行工作的(对同一进程而言)

②不安全分配方式

进程在发生 I/O请求后继续运行,需要时又发出第二个、第三个 I/O请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞状态

优点:一个进程可同时操作多个设备,从而使进程推进迅速。缺点:这种设备分配有可能产生死锁

5、逻辑设备名到物理设备名的映射

为了提高设备分配的灵活性和设备的利用率,方便实现 I/O重定向,引入设备独立性。设备独立性是指应用程序独立于具体使用的物理设备

为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备

系统中设置一张逻辑设备表(LUT),用于将逻辑设备名映射为物理设备名,LUT表项包括逻辑设备名、物理设备名和设备驱动程序入口地址。当进程用逻辑设备名请求分配设备时,系统为它分配相应的物理设备,并在 LUT中建立一个表项,以后进程再利用逻辑设备名请求 I/O操作时,系统通过查找 LUT来寻找相应的物理设备和驱动程序

系统采取两种方式建立逻辑设备表:

  1. 整个系统中只设置一张 LUT。所有进程的设备分配情况都记录在这张表中,不允许有相同的逻辑设备名,主要适用于单用户系统中
  2. 为每个用户设置一张LUT。当用户登录时,系统便为该用户建立一个进程,同时也为之建立一张 LUT,并将该表放入进程的 PCB中

2.4假脱机技术(SPOOLing技术)

为了缓和 CPU的高速性与 I/O设备的低速性之间的矛盾,引入了脱机输入/输出技术

该技术利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上,或者相反

SPOOLing是外部设备同时联机操作,又被称为假脱机输入/输出操作,是操作系统中采用的一项将独占设备改造成共享设备的技术

SPOOLing系统组成如图所示

1、输入井和输出井

在磁盘上开辟的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O设备输入的数据;输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据

2、输入缓冲区和输出缓存区

在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输出设备。

3、输入进程和输出进程

输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井。当 CPU需要输入数据时,直接将数据从输入井读入内存

输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备

共享打印机是使用 SPOOLing技术的一个实例,这项技术已被广泛地用于多用户系统和局域网络中。当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:

  1. 由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中
  2. 输出进程再为用户进程申请一张空白的用户请求打印表,将用户的打印要求填入其中,再将该表挂到请求打印队列上

SPOOLing系统的主要特点:提高了I/O的速度,将独占设备改造为共享设备,实现了虚拟设备功能

最新文章

  1. iOS --SQL的增加、删除、查找、修改
  2. hdu1045 DFS
  3. overflow:hidden清除浮动原理
  4. 希望各位博友能对我的自我介绍提出意见(要面试IBM的应用开发工程师,本科应届生一枚)
  5. 如何准备IREB考试
  6. 铺地毯(luogu 1003)
  7. C char** 的一点儿理解
  8. Linux CPU亲缘性详解
  9. MVC——数据库增删改查(Razor)
  10. java 利用注解实现BaseDao 增删查改
  11. 磁盘阵列RAID
  12. css技巧之如何实现ul li边框重合
  13. 工作中常用的 Linux 命令
  14. gradle 的jar下载到哪里了
  15. try or install Ubuntu on MeegoPad T01
  16. webpack window下配置的hello world
  17. 利用wget配合bash脚本同时下载多个文件
  18. mono for android读书笔记之硬件编程(转)
  19. c# -- Form1_Load()不被执行的三个解决方法
  20. python 使用set对list去重,并保持list原来顺序

热门文章

  1. 实现springboot对接腾讯云短信
  2. ELK的简单搭建
  3. 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!
  4. react-native 跳转到ios/android 权限设置界面
  5. POJ1743 Musical Theme (后缀数组 &amp; 后缀自动机)最大不重叠相似子串
  6. UESTC1961-咸鱼睡觉觉
  7. 551. 学生出勤纪录 I
  8. 【重温基础】15.JS对象介绍
  9. Java中final修饰的数据
  10. 理解Vue中的nextTick