目录
5.5 与设备无关的 I/O 软件
5.5.1 与设备无关软件的概念
5.5.2 与设备无关的软件的功能
5.5.3 设备分配
5.5.4 逻辑设备名到物理设备名映射的实现
5.6 用户层的 I/O 软件
5.6.1 系统调用与库函数
5.6.2 假脱机技术 SPOOLing
5.5 与设备无关的 I/O 软件
5.5.1 与设备无关软件的概念
为每个设备所配置的设备驱动程序是与硬件紧密相关的软件。为了实现设备独立性,必须再在设备驱动程序之上设置一层软件,称为与设备无关的 I/O 软件。
为了实现设备独立性而引入了 逻辑设备和物理设备 这两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备;而系统在实际执行时,仍然必须使用物理设备名称。
因此,系统必须具有将逻辑设备名称转换为某个物理设备名称的功能 -- 逻辑设备表。
实现设备独立性后,可带来两方面的好处:
① 设备分配时的灵活性:进程能以逻辑设备名称来请求使用某类设备。系统可立即将该类设备中未被分配的任意一个分配给进程,仅当所有该类设备已全部分配完毕时,进程才会被阻塞。
分配时需要使用银行家算法避免死锁。
② 易于实现 I/O 重定向:I/O 重定向是指用于 I/O 操作的设备可以更换,而不必改变应用程序。
修改逻辑设备表即可。
5.5.2 与设备无关的软件的功能
与设备无关的软件是 I/O 系统的最高层软件。
1、执行所有设备的公有操作
- 对独立设备的分配与回收
- 将逻辑设备名映射为物理设备名,进一步查找相应的驱动程序
- 对设备进行保护,禁止用户直接访问设备
- 缓冲管理,即对字符设备和块设备的缓冲区进行有效的管理
- 差错控制
设备映射表中含有设备驱动程序的首地址。
2、向用户层软件提供统一接口
无论何种设备,它们向用户所提供的接口应该是相同的。
对各种设备的读操作,在应用程序中都使用 read;而对各种设备的写操作,在应用程序中也都使用 write 。
5.5.3 设备分配
1、设备分配中的数据结构
在多道程序环境下,系统中的设备被所有进程共享,为防止进程对系统资源的无序竞争,必须由系统统一分配设备。除此之外,为了确保 CPU 与设备之间能够进行通信,还应分配相应的控制器和通道。
为实现设备分配,系统中应设置相应的数据结构。
① 设备控制表 DCT:系统为每个设备配置一张设备控制表,用于记录设备的特性及与设备控制器的连接情况。
指向控制器表的指针:指向该设备连接的设备控制器们的控制表 COCT 的指针。
设备队列的队首指针:指向请求该设备的进程们 PCB 的设备请求队列的指针。
② 控制器控制表、通道控制表和系统设备表
COCT:每个控制器配置一张表,它反映控制器的使用状态以及和通道的连接状况等。
CHCT:为每个通道配置一张表,它反映通道的使用状态。
SDT:记录已被连接到系统中的所有物理设备的情况。每个物理设备占一个表目,整个系统配置一张 SDT 。
2、设备分配过程
3、设备分配时应考虑的因素
① 设备的固有属性
- 独占性。在一段时间内,该设备只允许一个进程独占,即是临界资源。
- 共享性。在一段时间内,该设备允许多个进程共享。
- 可虚拟性。虚拟设备是利用某种技术把独占设备改造成可由多个进程共享的设备。
② 设备分配算法
- 先来先服务
- 优先级高者优先
I/O 设备速率慢 && 切换进程开销大 => 算法花样没有那么多
③ 设备分配中的安全性
安全分配方式
- 每当进程发出 I/O 请求后,便进入阻塞状态,I/O 操作完成后唤醒
- 摒弃了 “请求和保持” 条件,不会产生死锁
- 缺点:进程进展缓慢,即 CPU 与 I/O 设备串行工作
不安全分配方式
- 进程发出 I/O 请求后仍继续运行
- 可操作多个设备,推进迅速
- 缺点:不安全,具备 “请求和保持” 条件,可能死锁
设备分配程序的改进
1、基本分配程序的问题
- 进程以物理设备名提出 I/O 请求,无设备独立性。
- 采用单通路 I/O 系统结构,容易产生瓶颈。
2、改进方案
- 增加设备独立性
- 考虑多通路情况
增加通道的代价太大。
5.5.4 逻辑设备名到物理设备名映射的实现
1、逻辑设备表 LUT
用于实现将应用程序中的逻辑设备名映射为物理设备名。
物理设备名是 OS 分配的,因此在不同 OS 中同一物理设备的物理设备名可能不同。
2、逻辑设备表的设置
- 整个系统中设置一张 LUT (a)
- 为每个用户设置一张 LUT (b)
可见逻辑设备名保持不变,因此我们编写的程序也不用修改。
5.6 用户层的 I/O 软件
由于大部分 I/O 软件都在 OS 内部,只有一小部分在用户层。因此,用户层软件必须通过一组系统调用来取得操作系统服务。此外,现代高级语言通常提供了与各系统调用对应的库函数,因此用户程序也可以通过调用对应的库函数来使用系统调用。
5.6.1 系统调用与库函数
1、系统调用
2、库函数(Win32 API)
5.6.2 假脱机技术 SPOOLing
1、引入
虚拟性是 OS 的四大特征之一。多道程序技术将一台物理 CPU 虚拟为多台逻辑 CPU,从而允许多个用户共享一台主机。而 SPOOLing 技术将一台物理 I/O 设备虚拟为多台逻辑 I/O 设备,同样允许多个用户共享一台物理 I/O 设备。
2、SPOOLing 程序
在多道程序系统中,专门利用一道程序 -- SPOOLing 程序 -- 来完成对设备的 I/O 操作,无需使用外围 I/O 处理机。
在主机的直接控制下,实现脱机输入、输出功能,此时的外围操作与 CPU 对数据的处理同时进行。把这种在联机情况下实现的同时外围操作称为 SPOOLing (Simultaneaus Periphernal Operating On-Line) 或称为假脱机操作。
用联机的方式来实现脱机输入、输出功能:虽然 I/O 操作由 SPOOLing 程序来负责完成,但是 SPOOLing 程序还是需要 CPU 来运行,因此脱了但没完全脱。
3、SPOOLing 系统的处理过程
① 输入
1)进程 n 请求 => 输入进程为进程 n 在输入井中分配空间 => 设备数据由输入缓冲区送入输入井 => 同时生成 输入请求表 挂入 输入请求队列。
2)当 CPU 空闲时,从输入请求队列中取出一张输入请求表,并根据其中的任务,将设备数据送入内存中相应的进程缓冲区。
输入请求队列:
② 输出:打印
1)进程 n 请求 => 输出进程为进程 n 在输出井中分配空间 => 设备数据由进程缓冲区送入输出井 => 同时生成一张 打印请求表 挂入 打印请求队列。
2)当打印机空闲时,从打印请求队列中取出一张打印请求表,并根据其中的任务,取出输出井中相应的数据 => 输出缓冲区 => 打印。