0x19 I/O系统

I/O基本概念

计算机2个主要任务:

  1. I/O操作(更频繁)
  2. 计算

I/O设备特点:

  • 种类繁多,不断有新设备出现
  • 接口标准化:如USB

I/O系统的对象和任务

I/O系统的主要对象:I/O设备和对应的设备控制器

I/O系统的主要任务:

  • 完成用户提出的I/O请求
  • 提高I/O速率
  • 改善I/O设备的利用率

I/O系统的基本功能

  1. 隐藏物理设备的细节
  2. 与设备的无关性
  3. 提高处理机和I/O设备的利用率
  4. 对I/O设备进行控制.
  5. 确保对设备的正确共享
  6. 错误处理

设备独立性

为了提高操作系统的可适应性和可扩展性,现代操作系统中实现了设备独立性,也称为设备无关性。即应用程序独立于具体使用的物理设备。

实现方法:

  • 引入逻辑设备和物理设备
  • 在应用程序中使用逻辑设备名来请求使用某类设备
  • 而系统在实际执行时使用物理设备名
  • 系统必须具有将逻辑设备名转换为物理设备名的功能
  • 类似于存储管理中的逻辑地址和物理地址的概念

0x19 I/O系统

I/O应用接口

I/O系统调用将设备的行为封装成一些通用类型,每个通用类型都可以通过一组标准函数即接口来访问,具体的差别被设备驱动程序所封装。

设备驱动程序层的作用是为内核I/O子系统隐藏设备控制器的不同细节。

设备在许多方面有很大差异:字符流或块;顺序或随机访问;共享或独占;操作速度;读写、只读、只写。

将I/O系统与硬件分离的做法简化了开发人员的工作,也有利于硬件制造商设计新的设备与现有的控制器接口相兼容。

I/O设备

  1. 执行I/O操作的机械设备:I/O设备
  2. 执行控制I/O的电子部件:设备控制器

I/O设备与计算机通过一个连接点(也就是端口)进行通信。

如果一个或多个设备使用一组共同的线,那么这种连接称为总线bus。总线bus是一组线和一组严格定义的可以描述在线上传输信息的协议。有几种类型,如链环、共享总线等类型。

设备控制器

控制器是用于操作端口、总线或设备的一组电子器件。
0x19 I/O系统
0x19 I/O系统
控制器的主要功能
控制一个或多个l/O设备,以实现I/O设备和计算机之间的数据交换;它也是CPU与I/O设备之间的接口,接收从CPU发来的命令,并控制I/O设备工作,以使CPU从繁杂的设备控制事务中解脱出来。

I/O寄存器

  • 状态寄存器
  • 控制寄存器
  • 数据输入寄存器
  • 数据输出寄存器

驱动程序将抽象I/O命令转换成具体的命令和参数等装入设备控制器的相应寄存器,由控制器执行这些命令,具体实施对I/O设备的控制。

控制设备的具体方法

一种是通过使用特殊I/O指令来向指定的I/O端口地址传输字节,这使得访问内存和设备需要两种不同的指令。
另一种是内存映射I/O,设备控制寄存器的地址映射为内存地址,处理器通过标准的内存传输指令来完成对I/O的操作,这种方法统一了访问方法,简化了I/O编程。
有的系统同时使用两种技术。例如PC使用I/O指令来控制一些设备,而内存映射I/O来控制其他设备。

设备的几种分类

按信息交换的单位来分

  1. 块设备:以块为单位进行传输,如磁盘;
  2. 字符设备:按一个字节一个字节地传输,如终端。

访问方法

  1. 顺序访问:按其指定顺序传输数据,如调制解调器;
  2. 直接(随机)访问:可寻找任意数据存储位置,如CD-ROM。

传输速率

  1. 低速设备:如鼠标、语音输入输出等;
  2. 中速设备:如行式打印机、激光打印等;
  3. 高速设备:如磁带机、磁盘机、光盘机等。

设备的共享属性

  1. 独占设备:在一个时间上只能由一个进程使用,如打印机、扫描仪等;
  2. 共享设备:可以被多个进程并发使用,如磁盘。

I/O方向

  1. 只读设备:如CD-ROM;
  2. 只写设备:如图像控制器;
  3. 读写设备:如磁盘。

I/O控制方式

对I/O设备的控制方式

  1. 使用轮询的可编程I/O方式(基本不用)
  2. 使用中断的可编程I/O方式(广泛采用)
    可使CPU与I/O设备并行工作
  3. 直接存储器访问(DMA)方式
    进一步提高了CPU与I/O设备的并行操作程度
  4. I/O通道控制方式

轮询

又称可编程I/O。由CPU代表进程给I/O模块发I/O命令,询问设备是否忙,如果不忙即进行I/O。否则重复前面过程,直到操作完成才继续执行。这种方式使进程进入忙等。

设备的状态分为就绪、忙、出错,忙和就绪都不能进行I/O

轮询就是CPU不断读取设备状态寄存器,直到忙位被清除。这种方法实现很容易,是需要CPU干预最少的方式,但效率偏低。因为CPU会长期处于忙等状态。

中断机制

中断:使外设通知CPU的硬件机制。
CPU硬件有一根中断请求线IRL。

基本中断工作机制:
①CPU执行完每条指令后,检测IRL
②如检测到信号,CPU保存当前状态,并跳转到中断处理程序。
③执行中断处理程序
④执行完后,清除中断,返回

基于中断的I/O方式是一种异步的I/O方式。基本过程如下图所示。
0x19 I/O系统
0x19 I/O系统

中断相关概念

  1. 中断和软中断(陷入)
    中断是指CPU对I/O设备发来的中断信号的种响应,而陷入是指CPU内部事件所引起的中断。
  2. 中断向量表
    中断向量是中断向量表中的一项内容,即中断处理程序的内存地址。
    中断向量表存放每个设备的中断处理程序的入口地址,并将每个设备的中断请求作为一个中断号,对应于中断向量表中的一个表项。
  3. 中断优先级
    系统为每个中断源规定不同的优先级。
    中断机制也实现了中断优先级。系统为每个中断规定了不同的优先级。这样可以使CPU延迟处理低优先级申断。也可以让高优先级中断抢占低优先级中断处理。如陷入所赋予的中断优先级要比硬件中断优先级要低。
  4. 中断源
    引起中断的事件
  5. 绝大多数CPU有两个中断请求线
    一个是非屏蔽中断,主要用来处理如不可恢复内存错误等事件。一个是可屏蔽中断,可以由CPU在执行关键的不可中断的指令前加以屏蔽。
  6. 中断处理程序
    检测是否有未响应的中断信号;
    保护被中断进程的CPU环境;
    转入相应的设备处理程序;
    中断处理;
    恢复CPU的现场并退出中断。

中断是在现代操作系统中用来处理异步事件和设置陷阱进入内核模式的管理程序。
为了能使最紧迫的工作先做,现代计算机都使用中断优先级。
设备控制器、硬件错误、系统调用,都可以引起中断,并触发内核程序。由于中断大量的用于时间敏感的处理,所以高性能系统需要高效中断处理。

直接内存访问DMA

对于需要做大量传输的设备,例如磁盘驱动器,如果使用程序控制I/O,那么CPU的性能就浪费了。
许多计算机为了避免用程序控制I/O增加cpu的负担,将一部分任务下放给一个专用的处理器,称之为直接内存访问控制器,简称DMA控制器

利用DMA实现了内存和外设之间数据的快速传输。

下图说明了DMA控制器在计算机中的地位以及响应信号。
0x19 I/O系统
在开始DMA传输时,主机向内存中写入DMA命令块,该块包括传输的源地址指针、目标地址指针、传输的字节数。
CPU在将该命令块的地址写入到DMA控制器后,就继续其他工作。DMA控制器则继续下去,直接操作内存总线,无需主CPU的帮助,就可以将地址放到总线开始传输。

一般来说,PC上采用总线控制I/O的主板都拥有它们自己的高速DMA硬件。

DMA传输中的步骤

0x19 I/O系统
有的计算机体系结构的DMA使用物理内存地址,而有的使用直接虚拟内存访问DVMA,这里所使用的虚拟内存地址需要经过虚拟地址到物理地址转换。
DVMA可以直接实现两个内存映射设备直接的传输,而无需CPU的干涉或使用主内存。

I/O内核子系统

内核提供了很多与I/O有关的服务,许多服务如I/O调度、缓冲、高速缓存、假脱机与设备预留、错误处理是由内核I/O子系统提供的,并建立在硬件和设备驱动程序结构之上,还负责保护自己免受错误进程和恶意用户的危害。

I/O调度

调度一组I/O请求就是确定一个合适的顺序来执行这些请求。
应用程序发布的调度顺序并不一定是最佳选择。
调度能够改善系统整体性能,能在进程之间公平地共享设备访问,减少I/O完成所需要的平均等待时间。
0x19 I/O系统
在上图的例子中,操作系统如果按照2、3、1的顺序进行处理,则可以降低磁头所需移动的距离。按这种方法来重新安排服务顺序是I/O调度的核心。

操作系统开发人员通过为每个设备维护一个请求队列来实现调度。同时,操作系统为设备状态表配置等待队列。

所以,I/O子系统改善计算机效率的一个方法是进行I/O调度。另一个方法是使用主存或磁盘上的存储空间的技术,如缓冲、高速缓存、假脱机等。

缓冲区

缓冲区是用来保存两个设备之间,或设备和应用程序之间所传输数据的一个存储区域,可以有专门的硬件组成,更多的是用内存。

引入缓冲的理由

  1. 解决设备之间的速度差异
    例如,假如从调制解调器接收一个文件,并保存到磁盘上。调制解调器的速度大约比硬盘慢千倍。这时可以在内存中创建缓冲区以累积从调制解调器处接收到的字节。当缓冲区填满时,就可以通过一次操作将缓冲区写入到磁盘中。

  2. 协调传输数据大小不一致的设备
    这种不一致在计算机网络中特别常见。缓冲常常用来处理消息的分段和重组。
    在发送端,一个大消息分成着干小网络包,这些包通过网络传输,接收端将他们放在重组缓冲区中,以生成完整的源数据镜像。

  3. 支持应用程序I/O的复制语义
    例如某应用程序需要将缓冲区内的数据写入到磁盘,它可以调用write() 系统调用,并给出缓冲区的指针和所写字节的数量。
    当系统调用返回时,如果应用程序改变了缓冲区中的内容,为了维持复制语义,操作系统在write() 系统调用返回到应用程序之前,将应用程序缓冲区复制到内核缓冲区。
    磁盘写会在内核缓冲区中执行,这样后来应用程序缓冲区的改变就没有影响,这样做,尽管会有一定的开销,却获得了简洁的语义。

总的来说,缓冲提高了CPU和I/O设备之间的并行性。

高速缓存Cache

是可以保留数据副本的高速存储器。高速缓冲区副本的访问要比原来数据访问更为高效。
例如,正在运行的进程的指令既存储在磁盘上,也存在物理内存上,还被复制到CPU的二级和一级高速缓存中。

缓冲和高速缓存的差别:
缓冲可能是数据项的唯一的副本。而高速缓存只是提供了一个驻留在其它地方的数据在高速存储上的一个副本

SPOOLing技术

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

基本原理:利用其中的一道程序,模拟脱机输入时的外围控制机功能,把低速I/O设备上的数据传送到高速磁盘上;用另一道程序来模拟脱机输出时外围控制机的功能,把做据从磁盘传送到低速输出设备。
这样,就可以在主机的直接控制下,实现脱机输入、输出功能,此时的外围操作与CPU对数据的处理同时进行,这种在联机情况下实现的同时外围操作称为SPOOLing或假脱机技术。

SPOOLing系统的组成

0x19 I/O系统
从上图可以看出,SPOOLing系统可以由4部分组成。

  1. 输入井和输出井:这是在磁盘上开辟的两个大存储空间。
    输入井模拟脱机输入时的磁盘设备,用于暂存输入设备输入的数据。
    输出井模拟脱机输出时的磁盘,用于暂存用户程序的输出数据。
  2. 输入缓冲区和输出缓冲区:这是在内存中开辟的两个缓冲区,用于缓和CPU和磁盘之间速度不匹配的矛盾。
    输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。
    输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备。
  3. 输入进程和输出进程
    输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入设备通过输入缓冲区再送入输入井,当CPU需要输入数据时,直接从输入井读入内存。
    输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。
  4. 井管理程序:用于控制作业与磁盘井之间信息的交换。

SPOOLing的特点

SPOOLing的特点:

  • 提高了I/O的速度
  • 将独占设备改造为共享设备,因此实现了虚拟设备的功能。典型的以空间换时间的技术。
    虚拟设备就是指由独占设备改造为共享设备的那个设备,该设备只是逻辑上的设备。

SPOOLing技术的应用

打印机属于独占设备,利用SPOOLing技术,可将之改造为一台可供多个用户共享的设备,从而提高设备的利用率,也方便了用户。
如今,共享打印机技术已被广泛用于多用户系统和局域网络中。

假脱机打印系统

  1. 磁盘缓冲区
    是一块磁盘空间用来暂存用户程序的输出数据,也就是输出井。
  2. 打印缓冲区
    设在内存,暂存从磁盘缓冲区送来的数据,也就是输出缓冲区。
  3. 假脱机管理进程和假脱机打印进程
    假脱机管理进程为每个要求打印的用户数据建立一个假脱机文件,并放入文件队列中。假脱机打印进程依次对队列中的文件进行打印。
    当用户进程发出打印请求时,假脱机打印系统并不是立即把打印机分配给该用户进程,而是由假脱机管理进程完成两顶工作:
    ① 在磁盘缓冲区中为之申请一个空闲盘块,并将要打印的数据送入其中暂存。
    ② 为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入表中,再将该表挂到假脱机文件队列上。

真正的打印输出由假脱机打印进程负责:
当打印机空闲时,进程从请求打印队列的队首取出一张请求打印表,很据表中的要求将要打印的数据从输出并传送到内存缓冲区,再由打印机进行打印;打印完,进程再次察看请求打印队列。若非空,重复上述工作,直到队列为空。此后进程才将自己阻塞起来。仅当下次再有打印请求时,进程才被唤醒。

I/O内核子系统

I/O内核子系统的服务还包括:错误处理、I/O保护等。

错误处理:操作系统可以从磁盘读、设备无效、暂时写失败等错误中恢复。当出现I/O请求失败时,多数情况返回一个错误号。系统出错日志记录了错误报告。

I/O保护——防止非法I/O指令的执行

  • 定义I/O指令为特权指令
  • 应用程序I/O操作必须通过系统调用实现

采用内存保护的操作系统可以预防许多硬件和应用程序的错误,这样就不会因为小的机械失灵导致系统崩溃。

内核数据结构

  • 内核保存了I/O组件的状态信息,包括文件打开表、网络连接、字符设备状态等。

错误与保护息息相关。通过发出非法I/O指令,用户程序可以有意或无意的中断系统的正常操作,可以使用各种机制来确保这种中断不会发生。
例如,为了防止用户执行非法I/O,定义所有I/O指令为特权指令。这样用户就不能直接发出I/O指令,必须通过操作系统进行。
另外,所有的内存映射和I/O端口内存位置都受到内存保护系统的保护。
当然,内核需要保存了I/O组件的状态信息,包括文件打开表、网络连接、字符设备状态等。内核就使用了很多数据结构来保存这些信息。

考试前最后一篇了~~~