I/O设备分类
- 按信息交换单位分类
- 块设备
信息交换以数据块为单位。属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高、可寻址,即可以随机地读写任一块。
- 字符设备
信息交换以字符为单位。属于无结构设备,如交互式终端机、打印机等。基本特征是传输速率低、不可寻址,并且时常采用中断I/O方式。
- 按传输速率分类
- 低速设备
B/s ~ 102 B/s ,如键盘、鼠标。
- 中速设备
KB/s ~ 10KB/s,如激光打印机。
- 高速设备
102KB/s ~ 103MB/s,如磁盘机、光盘机。
- 按使用方式分类(详情见设备分配步骤)
I/O接口
I/O接口(设备控制器)位于CPU与设备之间,主要由三部分组成。
- 设备控制器与CPU的接口
该接口有三类信号线:数据线、地址线和控制线。
数据线通常与两类寄存器相连:数据寄存器(存放输入数据或输出数据)、控制/状态寄存器(存放控制信息或设备状态)
- 设备控制器与设备的接口
一个设备控制器可以连接一个或多个设备,因此控制器中有一个或多个设备接口。每个接口中都有数据、控制和状态三种类型的信号。
- I/O逻辑
用于实现对设备的控制。通过一组控制线与CPU交互,将从CPU传送来的I/O指令进行译码。
CPU启动设备时,将启动命令发送给控制器,同时将地址通过地址线送给控制器,由控制器I/O逻辑对地址进行译码,并相应地对所选设备进行控制。
I/O端口
I/O端口指设备控制器中可被CPU直接访问的寄存器,主要分为以下三类寄存器。
- 数据寄存器:实现CPU与外设之间的数据缓冲。
- 状态寄存器:获取执行结果和设备的状态信息,由CPU读取。
- 控制寄存器:由CPU写入,以启动命令或更改设备模式。
为了实现CPU与I/O端口及进行通信,需要对I/O端口进行编址,有以下两种编址方式:
- 独立编址
- 统一编址(内存映射I/O)
I/O控制方式
通道与一般处理机的区别:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,即通道与CPU共享内存;
通道与DMA方式的区别:DMA方式需要CPU来控制传输的数据块的大小、传输的内存位置;而通道方式中是由通道控制的。每个DMA控制器对应一台设备与内存传输数据,而每个通道可以控制多台设备与内存传输数据。
I/O软件层级结构
设备独立层软件功能:
- 向上层提供统一的调用接口(如read/write系统调用)
- 设备的保护
原理与文件保护类似。设备被看做是一种特殊的文件,不同用户对设备的访问权限是不同的。
- 差错处理
- 设备的分配与回收
- 数据缓冲区管理
通过缓冲屏蔽设备之间交换数据速度的差异与传输单位的差异。
- 建立逻辑设备名与物理设备名的映射关系;根据设备类型选择相应的驱动程序
用户层发出I/O操作相关的系统调用时,需要指明此次要操作的I/O设备的逻辑设备名。然后通过逻辑设备表(LUT,Logical Unit Table)来确定物理设备,并找到对应的驱动程序。
设备独立性也称设备无关性。为了实现设备独立性,引入了逻辑设备和物理设备。
使用逻辑设备名的好处是:
- 增加设备分配的灵活性
- 易于实现I/O重定向,所谓I/O重定向,是指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
设备具体的差别被设备驱动程序所封装,用于接收统一抽象的I/O命令,如read/write命令。
也会将设备控制器发来的信号传送给上层,从而为I/O内核子系统隐藏设备控制器之间的差异。
应用程序I/O接口
在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干接口。
- 字符设备接口
数据的存取与传输以字符为单位,如键盘、打印机等。基本特征是传输速率较低、不可寻址,并且在输入/输出时通常采用中断驱动方式。
get / put 操作。由于字符设备不可寻址,只能采取顺序存取方式,通常为字符设备建立一个字符缓冲区,用户程序通过get操作从缓冲区获取字符,通过put操作将字符输出到缓冲区。
in-control 指令。字符设备类型繁多,差异甚大,因此在接口中提供一种通用的 in-control 指令来处理(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。
字符设备都属于独占设备,为此接口中还需要提供打开和关闭操作,以实现互斥共享。
- 块设备接口
数据的存取与传输以数据块为单位,如磁盘。基本特征是传输速率较高、可寻址。I/O方式长常采用DMA方式。
隐藏了磁盘的二维结构。在二维结构中,每个扇区的地址都要磁道号和扇区号来表示。块设备接口将磁盘的所有扇区从0到n-1编号,变为了一维结构。
- 内存映射接口。内存映射接口通过内存的字节数组来访问磁盘,而不提供读/写磁盘的操作。映射文件到内存的系统调用返回包含文件副本的一个虚拟内存地址。只在需要访问内存映像时,才由虚拟存储器实际调页。内存映射文件的访问如同内存读写一样简单,极大地方便了程序员。
- 网络设备接口
大多操作系统提供的网络I/O接口为套接字接口,套接字接口的系统调用使应用程序创建的本地套接字连接到远程应用程序创建的套接字,以此来连接和发送数据。
- 阻塞/非阻塞I/O
操作系统的I/O接口还涉及两种模式:阻塞和非阻塞
阻塞I/O是指当用户进程调用I/O操作时,进程就会被阻塞,需要等待I/O操作完成,进程才被唤醒继续执行。
非阻塞I/O是指当用户进程调用I/O操作是,不阻塞该进程。通常,进程需要通过轮询的方式来查询I/O操作是否完成。
大多数操作系统采用的都是阻塞I/O。
设备分配
设备按使用方式分类可分为:
- 独占式使用设备
- 分时式共享使用设备
- SPOOLing方式使用设备
SPOOLing技术实现了虚拟设备功能,可以将设备同时分配给多个进程。这种技术实质上就是实现了对设备I/O操作的批处理。
设备分配的数据结构
- 设备控制表(DCT)
一个DCT就代表一个设备,表中都是设备的属性。凡是请求本设备而未得到满足的进程,应将其PCB按某种策略排成一个设备请求队列,DCT中的设备队列队首指针指向请求队列队首的PCB。
- 控制器控制表(COCT)
设备控制器控制设备与内存交换数据,而设备控制器又需要请求通道为它服务,因此每个COCT有一个表项存放指向相应通道控制表(CHCT)的指针。而一个通道可为多个设备控制器服务,因此CHCT中必定有一个指针指向CHCT所提供服务的设备控制器表。
- 通道控制表(CHCT)
CHCT与COCT是一对多的关系。
- 系统设备表(SDT)
整个系统只有一张,记录已连接到系统中的所有物理设备的情况。
设备分配策略
在多道程序系统中,进程数多于资源数,因此分配时需要考虑一些因素:
- I/O设备的固有属性
- I/O设备的分配算法
- I/O设备分配的安全性
- I/O设备的独立性
第一点在设备分配的数据结构中已经体现
设备分配原则
设备分配应根据设备特性、用户要求和系统配置情况,避免造成进程死锁,还要将用户程序与具体设备隔离开。
设备分配方式
- 静态分配
对独占式设备的分配。在作业开始执行前,一次性分配所有资源并直到结束后才归还。
不会出现死锁,效率低。
- 动态分配
当进程需要设备时,通过系统调用提出请求,系统按某种策略分配给进程所需要的设备、控制器。
一旦用完,立刻归还。
有可能出现死锁,效率高。
设备分配算法
常见的动态设备分配算法有先请求先分配、高优先级分配等。
对于独占设备,既可以采用动态分配,又可以采用静态分配,但往往采用静态分配。
对于共享设备,通常采用动态分配,但在每个I/O传输的单位时间内只被一个进程所占有,通常采用先请求先分配和高优先级的分配算法。
设备分配的安全性
设备分配的安全性指设备分配中应防止发生进程死锁。
- 安全分配方式。 每当进程发出I/O请求后便进入阻塞态,直到I/O操作完成后被唤醒。这样,一旦进程已经获得某种设备后便阻塞,不能再请求任何资源,而在它阻塞时也不保持任何资源。优点:设备分配安全;缺点:CPU与I/O串行工作。
- 不安全分配方式。进程发出I/O请求后仍然执行,需要时又请求第二个资源、第三个等等。仅当进程所请求的设备被另一个进程占用时,才进入阻塞态。优点:一个进程可同时占用多个设备,进程推进快;缺点:可能造成死锁。
设备分配时的独立性
设备分配步骤
SPOOLing技术(假脱机技术)
为了缓和CPU与I/O设备之间的速度差异,引入了脱机输入/输出技术。它是操作系统中将独占式设备改造为共享设备的技术。
利用专门的外围机,将低速I/O设备的数据传送到高速磁盘上,或者相反。
- 输入井和输出井
输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
一个进程的输入(或输出)数据保存为一个文件,所有进程的数据输入(或输出)文件链接成一个输入(或输出)队列。
- 输入缓冲区和输出缓冲区
输入缓冲区用于暂存由输入设备送来的数据,之后再传送给输入井。
输出缓冲区用于暂存从输出井送来的数据,之后再传送到输出设备。
- 输入进程和输出进程
用于模拟脱机输入/输出时的外围控制机。
用户要求的数据从输入设备到输出缓冲区到输入井,当CPU需要输入数据时,直接从输入井中取数据。
用户要求输出的数据从内存到输出井,当输出设备空闲时,将输出井中的数据经过输出缓冲区送到输出设备。
共享打印机
当用户请求打印输出时,SPOOLing系统同意,但是并不真正把打印机分配给该进程,而是由假脱机管理进程完成两项任务:
- 在磁盘缓冲区中申请一个空闲盘块,并将要打印的数据送入其中暂存。
- 为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂在假脱机文件队列上。
完成1.2.后,虽然还没有任何实际的打印输出,但是对于用户进程而言其打印任务已经完成了。
对用户而言,系统并非立即执行真实的打印操作,而是立即将数据送到输出到了缓冲区,真正的打印操作是打印机空闲且该打印任务已排在等待队列队首时进行的。
SPOOLing技术的特点:
- 提高了I/O速度,将对低速I/O设备执行的I/O操作演变成对磁盘缓冲区中数据的存取。(空间换时间)
- 将独占设备改造成了共享设备。在假脱机打印机系统中,实际上没有为任何进程分配设备。
- 实现了虚拟设备功能。对于每个进程而言,它们都认为自己独占了打印机。
缓冲区管理
cache 和 buffer 是两种机制。
高速缓存(cache)
磁盘高速缓存(disk cache)指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。
磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
高速缓存在内存中分为两种形式:
- 在内存中开辟一个单独的空间作为磁盘高速缓存,大小固定
- 把未利用的内存空间作为一个缓冲池,供请求分页和磁盘I/O时共享
缓冲区(buffer)
引入缓冲区的目的主要如下:
- 缓和CPU与I/O设备间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决基本数据单元大小(即数据粒度)不匹配的问题
- 提高CPU与I/O设备之间的并行性
缓冲区的实现方式主要有:
- 采用硬件缓冲器,但由于成本太高,除了一些关键部分外,一般不采用硬件缓冲器。
- 采用缓冲区(位于内存区域)
根据系统设置缓冲器的个数,缓冲技术可以分为以下几种。
单缓冲处理每块数据的用时为 max(C , T) + M