文章目录
I/O管理概述
I/O管理要完成哪些功能?
- 状态跟踪,要能实时掌握外部设备的状态
- 设备存取,要实现对设备的存取操作
- 设备分配,在多用户环境下,负责设备的分配与回收
- 设备控制,包括设备的驱动、完成和故障的中断处理
I/O 设备分类
IO设备被当做一种特殊的文件
根据使用特性分类
- 人机交互式设备:鼠标,打印机
- 网络通信设备:网络接口,调制解调器
- 存储设备:外存,辅存
根据传输速率分类
- 低速设备:键盘,鼠标
- 中速设备:行式打印机,激光打印机
- 高速设备:磁盘机,磁带机
根据信息交换单位分类
-
块设备
-
传输速率较高,可寻址(即可随机读/写任一块)
-
常采用DMA方式
-
数据传输的基本单位是“块”,如磁盘
-
-
字符设备
-
- 传输速率较慢,不可寻址
-
- 常采用中断驱动方式
-
- 数据传输的基本单位是字符,如鼠标、键盘
根据共享属性/设备分配方式分类
-
共享设备
-
在一段时间内允许多个进程同时访问的设备(并发访问)
-
一般采用动态分配
-
分配共享设备不会引起进程死锁
-
共享设备必须是可随机访问和可寻址的设备【我想这个要求是从效率考虑的。假设磁盘只能顺序访问,那么同时打开磁盘上的两个文件,这切换的代价也太大了】
-
-
独占设备(属于临界资源)
- 一段时间内只允许一个用户(进程)访问的设备
- 可采用动态分配和静态分配,一般采用静态分配
- 分配独占设备可能引起进程死锁(动态分配)
-
虚拟设备
- 以SPOOLing方式使用外部设备,通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用
I/O 控制方式
更详细内容见计组
程序直接控制方式
从外存读取数据,CPU需要对外设状态进行循环检査,直到确定该字已经在O控制器的数据寄存器中。
存在问题
I/O 设备无法向 CPU 报告自己完成了 I/O 操作,所以只能处理机不断循环询问 I/O 设备是否完成,别的啥也不干了,CPU 和 I/O 设备只能串行工作,CPU 利用率极低,属于忙等方式
中断驱动 I/O 控制方式
CPU 与 I/O 设备并行工作,仅当输完一个数据时,才需 CPU 花费极短的时间去做些中断处理
以字(节)为单位进行 I/O 的,每当完成一个字(节)的 I/O 时,控制器便要向 CPU 请求一次中断,所以 I/O 中断方式主要用在键盘、键盘等中速设备
存在问题
不适用于高速设备,如果用于磁盘就太低效了,1KB 的数据需要中断 1K 次
直接存储器访问(DMA)方式
中断驱动 I/O 控制方式中,I/O 设备与内存之间的数据交换需要经过CPU中转,DMA 的基本思想是,在 I/O 设备和内存之间开辟一条**“直接的数据通路”**,彻底解放 CPU
“直接的数据通路”:DMA 的这条数据通路是逻辑上的,其实就是总线,不过 DMA 请求具有更高的响应性,CPU 需要礼让 DMA 请求
数据传输的基本单位是数据块,从设备直接送入内存(或者相反),仅在传送一个或多个(连续的)数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的
周期窃取
又叫周期挪用,是指利用CPU不访问 存储器的那些周期来实现DMA操作
存在问题
CPU 每发出一次 I/O 指令,只能读/写一个或多个连续的数据块(别管是几个,必须是连续的),希望进一步减少 CPU 的干预,于是有了通道控制方式
DMA与中断控制方式对比
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/996ae9ccfaa4c1b2b001eba7f113ba8f.png)
I/O 通道控制方式
DMA 方式的进一步发展:
- 把对一个数据块的读(或写)为单位的干预减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预
- DMA 方式需要 CPU 来控制传输数据块的大小,传输的内存地址,而通道方式中,这些信息是由通道决定的
- 一个 DMA 控制器对应一台设备,而一个通道可以对应多个 I/O 控制器(一个 I/O 控制器又可以控制多台同类型设备)
I/O 通道
一种硬件,可以视为“弱鸡版”CPU
通道程序
由一系列通道指令(或称为通道命令)所构成的,不属于机器指令,属于通道自己的指令,存放在主存中,由通道从主存中取出并由通道来执行
工作过程
CPU 向通道发送一条 I/O 指令(指明操作的设备、通道程序的地址)。通道在收到该指令后,从内存中取出本次要执行的通道程序,然后执行该通道程序,当通道完成了规定的 I/O 任务后(全部放入内存),向 CPU 发中断信号(实现了 CPU、通道和 I/O 设备三者的并行操作)
I/O 硬件
电子部件:设备控制器(I/O控制器)
设备控制器是计算机中的一个实体, 其主要职责是控制一个或多个 I/O 设备, 以实现 I/O 设备和计算机之间的数据交换。 它是 CPU 与 I/O 设备之间的接口, 它接收从 CPU 发来的命令,并去控制 I/O 设备工作。
设备控制器的(组成)基本功能
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aebba48842186e36f53cc2635e6eb63c.png)
-
控制寄存器:接收和识别 CPU 或通道发出的命令
磁盘控制器可以接收 CPU 发来的 Read、 Write、 Format 等 15 条不同的命令
-
数据寄存器:实现主机和外设的数据交换
**CPU 与控制器之间:**通过数据总线,由 CPU 并行地把数据写入控制器,或从控制器中并行地读出数据(如果是 DMA 或通道方式的话,那就是“主存”与控制器)
**控制器与设备之间:**设备将数据输入到控制器,或从控制器传送给设备
-
状态寄存器:标识和报告设备的状态
记录 IO 设备的状态,例如,仅当该设备处于发送就绪状态时,CPU才能启动控制器从设备中读出数据
-
地址译码器:地址识别和设备选择
每个设备控制器的寄存器都有唯一的地址,详见计组
**内存映象I/O:**控制器中的寄存器与内存地址统编址,可以采用对内存进行操作的指令来对控制器进行操作
**寄存器独立编址:**控制器中的寄存器使用单独的地址,需要设置专门的指令来操作控制器
-
数据缓冲,使用缓冲器缓和CPU与IO设备的速度差异
-
信号格式的转换,实现电平转换、串/并转换、模/数转换等
-
差错控制,若传送中出现了错误,向 CPU 报告,CPU 将重新进行一次传送
机械部件:I/O设备
…
I/O 软件
I/O 系统的层次概述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1746ec8a2c25f8a26fa68bf9cf746719.png)
先从宏观上理解下各层的功能作用
用户层软件,产生IO请求,比如给打印机一个打印任务;设备独立性软件,实现设备独立性是指用户在编程序时使用的设备与实际设备无关。用户程序中只指明IO使用的设备类型即可。意思就是,不管是磁盘还是打印机,用户都可以使用同一个比如 read/write 实现读写,设备独立性软件负责将其翻译成相应硬件的命令和参数。但是由于不同厂商生产的硬盘/打印机会有很大差异。所以需要设备驱动程序,负责把这些命令和参数转换成更具体的IO命令,发送给设备控制器。设备控制器再按照命令和参数完成相应任务,在完成任务后,控制器发出一个中断信号,请求CPU处理IO请求,所以有中断处理程序
用户层软件
实现与用户交互的接口,用户可直接通过在用户层提供的、与 I/O 操作有关的库函数,对设备进行操作
设备独立性软件
设备独立性软件。用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
主要功能
- 执行所有设备的公有操作:对设备的分配与回收,建立逻辑设备名到物理设备名的映射关系等
- 向用户层(或文件层)提供统一的调用接口(read/write)
- 建立逻辑设备名到物理设备名的映射关系
- 向设备驱动程序提供根据相应设备翻译后的命令和参数
设备独立性
实现设备独立性是指用户在编程序时使用的设备与实际设备无关,简单来说,就是应用程序不需要考虑使用的是磁盘还是打印机,对它们可以用统一的 read/write 命令实现读写。
为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备;而系统在实际执行时,还必须使用物理设备名称。因此,系统须具有将逻辑设备名称转换为某物理设备名称的功能,这非常类似于存储器管理中所介绍的逻辑地址和物理地址的概念。在应用程序中所使用的是逻辑地址,而系统在分配和使用内存时,必须使用物理地址
逻辑/物理设备名映射
使用逻辑设备表 LUT 建立物理设备名到逻辑设备名的映射
如果整个系统中只设置一张 LUT,则不允许具有相同的逻辑设备名,如果为每个用户设置一张 LUT,则允许
设备独立性的好处?
-
方便用户编程
-
便于程序移植
-
易于实现 I/O 重定向(例如,在调试一个应用程序时,可将程序的所有输出送往屏幕显示;而在程序调试完后, 如需正式将程序的运行结果打印出来, 此时便须将逻辑设备表中的显示终端改为打印机,而不必修改应用程序)
设备驱动(处理)程序
请求 I/O 的进程与设备控制器之间的一个通信和转换程序
主要功能
- 接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求(read,write)转换为具体要求,发出 I/O 命令(发送给设备控制器,如果是通道,驱动程序根据用户的 I/O 请求,获得通道程序)
- 将由设备控制器发来的信号传送给上层软件,及时响应由控制器或通道发来的中断请求
中断处理程序
见计组
缓冲管理
磁盘高速缓存
利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息
磁盘高速缓存逻辑上属于磁盘,物理上是驻留在内存中的盘块(数据)
缓冲区
引入缓冲区的原因
- 缓和 CPU 与 I/O 设备间速度不匹配的矛盾
- 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制
- 解决发收两端数据单元大小不匹配的问题
实现方法
- 硬件缓冲器,成本太高(Cache)
- 采用位于内存中的缓冲区(磁盘高速缓存)
单缓冲
…
双缓冲
…
循环缓冲
…
缓冲池
…
设备分配与回收
在多道程序环境下,系统中的设备供所有进程共享。为防止诸进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须由系统统一分配。【I/O调度】每当进程向系统提出I/O 请求时,只要是可能和安全的,设备分配程序便按照一定的策略,把设备分配给请求用户(进程)。
根据共享属性/设备分配方式分类
-
共享设备
-
在一段时间内允许多个进程同时访问的设备(并发访问)
-
一般采用动态分配
-
分配共享设备不会引起进程死锁
-
共享设备必须是可随机访问和可寻址的设备【我想这个要求是从效率考虑的。假设磁盘只能顺序访问,那么同时打开磁盘上的两个文件,这切换的代价也太大了】
-
-
独占设备(属于临界资源)
- 一段时间内只允许一个用户(进程)访问的设备
- 可采用动态分配和静态分配,一般采用静态分配
- 分配独占设备可能引起进程死锁(动态分配)
-
虚拟设备
- 以SPOOLing方式使用外部设备,通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用
设备分配策略
设备分配原则
既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开。
设备分配方式
静态分配(独享分配策略)
主要用于对独占设备的分配,一次分配,进程“死”前终身享用,不会造成死锁
是否会出现死锁?这里王道资料和教材上产生了冲突
教材上说会出现死锁,而王道书上说不会出现死锁。来探究下,死锁的四个必要条件是否满足。
**互斥条件:**独占设备,显然满足。
**不剥夺条件:**根据描述,进程撤销前始终持有该设备,所以满足。
**环路等待条件:**这个也是可以满足的
请求和保持条件:根据描述“执行前一次性分配”,那么显然这个条件是不满足的,所以我认为是不会出现死锁。
动态分配
主要用于共享设备(虚拟设备是指一台物理设备在采用虚拟技术后,可变成多台逻辑上的虚拟设备,虚拟设备也是可共享的设备)
按需分配,用完释放,较高的设备利用率,但有可能造成进程死锁
设备分配安全性
安全分配方式
当进程发出 I/O 请求后,便进入阻塞状态,直到其 I/O 操作完成时才被唤醒
不安全分配方式
进程在发出 I/O 请求后仍继续运行, 可以发出新的 I/O 请求, 仅当进程所请求的设备已被另一进程占用时, 请求进程才进入阻塞状态
SPOOLing 技术
为了缓和 CPU 的高速性与 I/O 设备低速性间的矛盾而引入了脱机输入、 脱机输出技术
SPOOLing 技术是来模拟脱机输入、输出的一种技术,能够提高设备的整体利用率
SPOOLing 系统的组成
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/416545976dfa5f95fbdeaa89420266fb.png)
SPOOLing技术如何用空间换时间的?
SPOOLing技术是一种以空间换时间的技术,我们很容易理解它牺牲了空间,因为它开辟了磁盘上的空间作为输入井和输出井,但它又如何节省时间呢?
磁盘是一种高速设备,在与内存交换数据的速度上优于打印机、键盘、鼠标等中低速设备。试想一下,若没有 SPOOLing技术,CPU要向打印机输出要打印的数据,打印杋的打印速度比较慢,CPU就必须迁就打印机,在打印机把数据打印完后才能继续做其他的工作,浪费了CPU的不少时间。在 SPOOLing技术下,CPU要打印机打印的数据可以先输出到磁盘的输出井中(这个过程由输出进程控制),然后做其他的事情。若打印机此时被占用,则SPOOLing系统就会把这个打印请求挂到等待队列上,待打印机有空时再把数据打印出来。向磁盘输岀数据的速度比向打印机输出数据的速度快,因此就节省了时间。