操作系统概论:输入输出管理

本文详细介绍了输入输出设备的分类、I/O控制方式,包括程序直接控制、中断驱动、DMA和通道控制,以及假脱机技术。讨论了I/O系统的层次结构,重点阐述了设备分配的策略、步骤和相关数据结构。此外,还探讨了缓冲区管理,如单缓冲、双缓冲和循环缓冲区的作用和效率。最后,提到了设备分配时应考虑的因素和不同分配方式。
摘要由CSDN通过智能技术生成

什么是输入输出设备

可以将数据输入到计算机,或者可以接受计算机输出数据的外部设备

I/O设备分类

按使用特性分

  • 人机交互类设备:如鼠标键盘等。
  • 存储设备:如移动硬盘、光盘等。
  • 网络通信设备:如调制解调器等。

按传输速率分

  • 低速设备:如鼠标键盘等。
  • 中速设备:激光打印机等。
  • 高速设备:磁盘等。

按信息交换的单位分

  • 块设备:数据传输的基本单位是块,可寻址
  • 字符设备:数据传输的基本单位是字符,不可寻址,常采用中断驱动方式。

I/O控制

I/O控制器:CPU无法直接控制I/O设备的机械部件,因此在两者中间引入了一个电子部件I/O控制器,用于实现CPU对I/O设备的控制。

I/O控制器的功能:

  • 接受和识别CPU发出的命令。(控制寄存器)
  • 向CPU报告设备的状态。(状态寄存器)
  • 数据交换。(数据寄存器)
  • 地址识别:识别CPU要控制的是哪个寄存器。

I/O控制器的组成:
请添加图片描述CPU与控制器通信流程:CPU通过控制线发出指令,同时通过地址线指明要操作的是哪一个设备,以输出数据为例,还要把待输出数据通过数据总线送到I/O控制器的数据寄存器中,I/O指令的参数通过数据总线送到I/O控制器的控制寄存器中,并从状态寄存器中读出设备状态通过数据总线送到CPU。

控制器与设备通信流程:I/O逻辑层将数据寄存器中的数据取出,送往设备接口。设备通过接口接收命令,并将自己的状态发送到控制器

注意:一个I/O控制器可以同时控制多个设备。所以会有多个数据、控制、状态寄存器,为了区分这些寄存器,需要给其编址。一种编址方法是内存映像I/O,即延伸内存地址,另一种方法是独立编址,这种方式需要专门的指令支持。

I/O系统层次结构

  1. 用户层I/O软件:如printf,此层处理后,库函数被翻译为等价的系统调用。
  2. 设备独立性软件:处理系统调用,检查访问权限(设备保护)、对设备产生的差错进行处理、设备(是临界资源)的分配与回收、数据缓冲区管理、通过逻辑设备表LUT建立逻辑设备名到物理设备名的映射,并为其选择合适的驱动程序。
  3. 驱动程序:对不同硬件设备的具体控制。
  4. 中断处理程序:I/O控制器在I/O完成后会发送一个中断信号,系统根据中断信号类型找到相应的中断处理程序执行。

I/O控制方式

方式CPU干预频率数据传送单位数据流向优点缺点
程序直接控制方式很频繁,I/O操作开始前、进行中、完成后均需要CPU。读时 设备到CPU寄存器到内存,写时反向。实现简单,不需硬件参与。CPU和设备是串行工作,效率低,因为其发完指令后只能等待I/O。
中断驱动方式I/O操作开始前、完成后需要CPU介入。每次中断传一个字。同程序直接控制方式。不再需要轮询,使得CPU和I/O设备可并行工作。每次中断只能传一个字,中断也需要一定开销。每个字从I/O设备到内存均需经过CPU寄存器。
DMA方式发出读指令、每个数据块传输完毕后需要CPU介入。一个或多个连续块。设备到内存。数据传输以块为单位,效率较中断方式更高,且传输时不需CPU介入,提升了并行性。CPU发出一条I/O指令只能读写一个或多个连续 (!) 数据块,且其在内存中也需连续存放。
通道控制方式下发读写指令、完成一组任务后需要CPU介入。一组数据块(在通道程序中指明)。同DMA方式。CPU、通道、I/O设备均可并行工作,效率高。实现复杂,需要通道硬件的支持。

程序直接控制方式

读操作流程:

  1. CPU向控制器发出读指令,由控制器启动相应设备,并将其状态置为未就绪。
  2. CPU轮询检查控制器的状态,直至其变为已就绪,说明设备已准备好了需要的数据;或为错误,则进行错误处理。
  3. 输入设备准备好数据后将数据传给控制器,并报告自身状态。
  4. 控制器将输入数据放到数据寄存器中,并修改状态寄存器的值为已就绪。
  5. CPU将数据读到CPU的寄存器中,再转移到内存。

中断驱动方式

读操作流程:

  1. CPU发出读命令后,将此需要Input的进程阻塞,切换至别的进程执行。
  2. 当I/O完成后,控制器向CPU发出中断信号。
  3. CPU在每条指令周期的末尾检查中断,检测到中断信号时进行中断处理,处理时从I/O控制器读一个字送到CPU寄存器,然后送到内存。

DMA方式

DMA即:Direct Memory Access,直接存储器存取。每个DMA控制器控制一台设备。

读操作流程:

  1. CPU向DMA控制器下发读数据块指令及必要参数(如读入多少数据、内存缓冲区的位置、待读入数据的地址等)。
  2. 由DMA控制器全权完成读操作,直接将数据块读到内存中。当一块数据全部传完时,DMA向CPU发送一个中断信号。
  3. CPU进行中断处理。

为了有效地使用主存,当DMA访存与CPU访存产生冲突时,常采用周期挪用(周期窃取)的方式。
即当I/O设备没有DMA请求时,CPU按程序要求访存,一旦I/O设备有了DMA请求,则遵循如下原则进行处理:

  • 若此时CPU未在访存,则允许DMA访存。
  • 若此时CPU正在访存中,则待CPU访存完毕后,将总线占有权让出,DMA访存。
  • 若CPU与DMA同时提出访存请求,则CPU暂时放弃总线占有权,由I/O设备挪用一个或数个存取周期。

通道控制方式

通道是一种特殊的硬件,一个通道可控制多个设备与内存进行数据交换。

读操作流程:

  1. CPU向通道(硬件)发出读指令,并指明此次用到的通道程序(可理解为任务清单)在内存中的位置、要操作的是哪个I/O设备后,CPU可进行进程切换。
  2. 通道执行通道程序,程序中指明了要读入多少数据、内存缓冲区位置等。
  3. 通道执行完任务后向CPU发出中断。
  4. CPU进行中断处理。

假脱机技术

脱机技术:
在这里插入图片描述

假脱机技术:指用软件的方式模拟脱机技术,引入了一个输入井模拟脱机输入时的磁带,用于收容I/O设备输入的数据,同样也有一个输出井。用输入进程和输出进程模拟脱机技术中的外围控制机。

共享打印机的实现:
当多个进程提出输出打印的请求时,系统立即对请求作出应答,但由于打印机是独占资源,并不能被共享,因此不能满足所有用户的请求。此时将由假脱机管理进程进行处理

  1. 在位于磁盘的输出井中为进程申请一个空闲缓冲区,并将进程待打印的数据送入其中。
  2. 为进程申请一张空白的请求打印表,表中包含待打印数据的磁盘位置等信息,再将该表挂到假脱机文件队列上。
  3. 当打印机空闲时,输出进程从假脱机文件队列上取下一张打印请求表,将待打印数据从输出井中传送到输出缓冲区中,再传到打印机中进行打印。

SPOOLING技术可以把一台物理设备虚拟为多台逻辑设备,表现为可同时响应多个进程的请求,可将独占式设备改造为共享设备。

设备分配与回收

分配时应考虑的因素

  • 设备的固有属性:独占设备、(并发式)共享设备、虚拟设备(如SPOOLing)。
  • 设备分配算法:FCFS、SJB等。
  • 分配时的安全性:安全分配方式(为进程分配一个设备后将其阻塞,直到I/O完成再唤醒。这种方式保证了一段时间内进程只能使用一个设备,破坏了请求保持条件,避免了死锁,但是CPU和I/O设备只能串行工作,执行效率低。)、不安全分配方式(为进程分配设备后可继续为其分配设备,直到其请求得不到满足时将其阻塞。这种方式执行效率高,但可能死锁,需要进行死锁避免、死锁的检测和解除。)

设备分配方式

静态分配:进程运行前为其分配全部所需资源,待其运行结束后归还。

动态分配:进程运行中动态分配资源。

设备分配管理的数据结构

一个通道可控制多个设备控制器,一个设备控制器可控制多个设备。

设备分配管理中涉及四种数据结构:设备控制表、控制器控制表、通道控制表、系统设备表。

设备控制表(DCT):每个设备都有一张,用于记录设备情况。

设备控制表的字段:

  • 设备类型:打印机 / 扫描仪等。
  • 设备标识符:物理设备名,唯一。
  • 设备状态:忙碌 / 空闲等。
  • 指向控制器表的指针:指向此设备从属的控制器的信息。
  • 重复执行次数:一次失败后又重复尝试的次数。
  • 进程队列的队首指针:正在等待该设备的进程的PCB组成的队列。

控制器控制表(COCT):每个设备控制器有一张,用于对控制器进行操作及管理。

控制器控制表的字段:

  • 控制器标识符
  • 控制器状态
  • 指向所从属的通道表的指针
  • 进程队列的队首指针
  • 进程队列的队尾指针

通道控制表(CHCT):每个通道一张,用于对通道进行操作和管理。

通道控制表的字段:

  • 通道标识符
  • 通道状态
  • 管辖的控制器表始址
  • 进程队列的队首指针
  • 进程队列的队尾指针

系统设备表(SDT):记录了系统中全部设备的情况,每个设备在其中占一个条目。

系统设备表的字段:

  • 设备类型
  • 设备标识符
  • 设备控制表
  • 驱动程序入口

设备分配步骤

根据物理设备名进行分配的步骤如下:

  1. 进程根据物理设备名(设备标识符)发出请求,操作系统接收到请求后查找系统设备表SDT。
  2. OS根据SDT找到设备控制表DCT,判断设备状态,若空闲,则将设备分配给进程;否则将进程的PCB挂到设备的进程等待队列中,并将其阻塞,直到分配后才唤醒。
  3. 根据DCT找到控制器控制表COCT,判断控制器状态,同上。
  4. 根据COCT找到通道控制表CHCT,判断通道状态,同上。
  5. 只有设备、控制器、通道三者都分配成功才算作设备分配成功,可以开始数据传送。

这种方式缺点如下:

  • 用户编程时需要知道物理设备名,这需要了解底层细节。
  • 若物理设备更换为同种的另一个设备则无法运行。
  • 只能对特定物理设备发出请求,即使有同类设备处于空闲也无法分配。

为了解决上述问题,引入了一个新的数据结构:逻辑设备表(LUT),其字段为(逻辑设备名、物理设备名、驱动程序入口地址)当某用户进程第一次通过逻辑设备名对OS提出请求且分配成功时,OS在LUT中新增一个条目;若其对同一个逻辑设备名再次请求,则OS直接查找LUT表项找到其驱动程序入口地址。

逻辑设备表分为两种:单用户操作系统中整个系统使用一张LUT、多用户操作系统中每个用户使用一张LUT。

根据逻辑设备名进行分配的步骤如下:

  1. OS根据进程请求的逻辑设备名查找SDT,找到一个指定类型且空闲的设备,就将其分配给该进程,并在逻辑设备表中新增一个条目。只有此类型的设备全部无法分配时才将进程阻塞。
  2. 同前文。

缓冲区管理

什么是缓冲区

缓冲区是一个存储区域,可以由专用硬件(如快表)组成,也可用内存(主要)代替。

缓冲区非空时,只能读不能写,缓冲区为空时可写,但只能在写满后进行读。

缓冲区的作用

  • 缓和CPU与I/O设备之间的速度矛盾。
  • 减少对CPU的中断。
  • 解决数据粒度的不匹配问题。
  • 提高CPU与I/O设备的并行性。

单缓冲

当用户进程请求某种块设备读入若干块数据时,OS在主存中为其分配一个块大小的缓冲区。

假设初始状态为:工作区满,缓冲区空。计算处理一块数据的平均用时。

其输入过程如下
在这里插入图片描述
T>C时,工作周期如下,为M+T
在这里插入图片描述

T<C时,工作周期如下,为M+C
在这里插入图片描述

所以单缓冲区方式平均处理每块数据的时间为max(C, T) + M。

双缓冲

当用户进程请求某种块设备读入若干块数据时,OS在主存中为其分配两个块大小的缓冲区。

假设初始状态为:工作区空,缓冲区一个满,另一个空。计算处理一块数据的平均用时。

T>C+M时,工作周期如下,为T:
在这里插入图片描述
T<C+M时,无法使用上述方法分析,但每经一个C+M就有一块数据处理完毕,因此认为其工作周期为C+M:
在这里插入图片描述
所以双缓冲方式平均处理一个数据块的耗时为max(T, C+M)

循环缓冲区

将多个大小相等的缓冲区链接为一个循环队列。
在这里插入图片描述

缓冲池

缓冲池由系统中共用的缓冲区组成,包括空缓冲队列、输入缓冲区队列、输出缓冲区队列。
在这里插入图片描述

根据缓冲区扮演的角色又分为:

  • 输入进程请求输入数据时使用的hin。
  • 计算进程想取得一块输入数据时使用的sin。
  • 计算进程想将结果给其他进程时使用的hout。
  • 输出进程请求输出数据时使用的sout

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值