IO 系统的功能、模型和接口
目录
参考资料:
I/O 系统管理的主要对象是 I/O 设备和相应的设备控制器。其最主要的任务是,完成用户提出的 I/O 请求,提高 I/O 速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。
1 I/O 系统的基本功能
1.1 隐藏物理设备的细节
I/O 设备控制器是一种硬件设备,用来对各类型的 I/O 设备进行控制,其中包含有若干个用于存放控制命令的寄存器和存放参数的寄存器。用户通过这些命令和参数,可以控制外部设备执行所要求的操作。
对于不同的设备,需要有不同的命令和参数。例如,在对磁盘进行操作时,不仅要给出本次是读还是写的命令,还需给出源或目标数据的位置,包括磁盘的盘面号、磁道号和扇区号。由此可见,如果要求程序员或用户编写直接面向这些设备的程序,是极端困难的。因此,I/O 系统必须通过对设备加以适当的抽象,以隐藏掉物理设备的实现细节,仅向上层进程提供少量的、抽象的读/写命令,如 read、write 等。
1.2 与设备的无关性
与设备的无关性是是在隐藏物理设备细节的基础上实现的。
一方面,用户不仅可以使用抽象的 I/O 命令,还可使用抽象的逻辑设备名来使用设备,例如,当用户要输出打印时,他只须提供读(或写)的命令(提出对 I/O 的要求),和提供抽象的逻辑设备名如 /dev/printer,而不必指明是哪一台打印机。
另一方面,也可以有效地提高 OS 的可移植性和易适应性,对于 OS 本身而言,应允许在不需要将整个操作系统进行重新编译的情况下,增添新的设备驱动程序,以方便新的 I/O 设备的安装。如 Windows 中,系统可以为新 I/O 设备自动安装和寻找驱动程序,从而做到即插即用。
1.3 提高处理机和 I/O 设备的利用率
I/O 系统要尽可能地让处理机和 I/O 设备并行操作,以提高它们的利用率。
- 一方面,要求处理机能快速响应用户的 I/O 请求,使 I/O 设备尽快地运行起来;
- 另一方面,也应尽量减少在每个 IO 设备运行时处理机的干预时间。
1.4 对 I/O 设备进行控制
对 I/O 设备进行控制是驱动程序的功能。目前对 I/O 设备有四种控制方式:
- 采用轮询的可编程 I/O 方式
- 采用中断的可编程 I/O 方式
- 直接存储器访问方式
- I/O 通道方式。
具体应采用何种控制方式,与 I/O 设备的传输速率、传输的数据单位等因素有关。
比如传输的数据是字节还是数据块等
1.5 确保对设备的正确共享
从设备的共享属性上,可将系统中的设备分为如下两类:
- 独占设备,进程应互斥地访问这类设备,即系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。典型的独占设备有打印机、磁带机等。系统在对独占设备进行分配时,还应考虑到分配的安全性。
- 共享设备,是指在一段时间内允许多个进程同时访问的设备。典型的共享设备是磁盘,当有多个进程需对磁盘执行读、写操作时,可以交叉进行,不会影响到读、写的正确性。
1.6 错误处理
大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。从处理的角度,可将错误分为临时性错误和持久性错误。
对于临时性错误,可通过重试操作来纠正,只有在发生了持久性错误时,才需要向上层报告。例如,在磁盘传输过程中发生错误,系统并不认为磁盘已发生了故障,而是可以重新再传,一直要重传多次后,若仍有错,才认为磁盘发生了故障。
由于多数错误是与设备紧密相关的,因此对于错误的处理,应该尽可能在接近硬件的层面上进行,即在低层软件能够解决的错误就不向上层报告,因此高层也就不能感知;只有低层软件解决不了的错误才向上层报告,请求高层软件解决。
总结:
- 第 1、2 方面的功能是为了方便用户使用 I/O 设备
- 第 3、4 方面的功能是用于提高 CPU 和 I/O 设备的利用率
- 第 5、6 方面的功能是为用户在共享设备时提供方便,以保证系统能有条不紊的运行,当系统发生错误时能及时发现错误,甚至于能自动修正错误。
2 I/O 系统的层次结构和模型
I/O 软件涉及的面很宽,向下与硬件有密切关系,向上又与文件系统、虚拟存储器系统和用户直接交互,它们都需要 I/O 系统来实现 I/O 操作。为使十分复杂的 I/O 软件能具有清晰的结构、更好的可移植性和易适应性,目前已普遍采用层次式结构的 I/O 系统。这是将系统中的设备管理模块分为若干个层次,每一层都是利用其下层提供的服务,完成输入输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。
类似计网的网络分层模型
2.1 I/O 软件的层次结构
通常把 I/O 软件组织成四个层次,如下图所示,各层次及其功能如下,图中的箭头表示 I/O 的控制流:
分层是解决复杂问题的一种指导思想:由繁到简、由易到难
- 用户层 I/O 软件
实现与用户交互的接口,用户可直接调用该层所提供的、与 I/O 操作有关的库函数对设备进行操作。
- 设备独立性软件
用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
- 设备驱动程序
与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序。
- 中断处理程序
用于保存被中断进程的 CPU 环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的现场后,返回到被中断的进程。
2.2 I/O 系统中各种模块之间的层次视图
1 I/O 系统的上、下接口
- I/O 系统接口
它是 I/O 系统与上层系统之间的接口,向上层提供对设备进行操作的抽象 I/O 命令,以方便高层对设备的使用。有不少 OS 在用户层提供了与 I/O 操作有关的库函数,供用户使用。在上层系统中有文件系统、虚拟存储器系统以及用户进程等。
- 软件/硬件(RW/HW)接口
软件和硬件之间的接口,由于设备种类繁多,该接口相当复杂。
下边这个图,清晰的展示的 I/O 系统中各种模块之间的层次结构:
2 I/O 系统的分层
与 I/O 软件组织的层次结构相对应,I/O 系统本身也可分为如下三个层次:
- 中断处理程序
它处于 I/O 系统的底层,直接与硬件进行交互。
- 设备驱动程序
它是进程和设备控制器之间的通信程序。其主要功能是,将上层发来的抽象 I/O 请求转换为对 I/O 设备的具体命和参数,并把它装入到设备控制器中的命令和参数寄存器中,或者相反。由于设备之间的差异很大,每类设备的驱动程序都不相同,故必须由设备制造厂商提供,而不是由 OS 设计者来设计。因此,每当在系统中增加一个新设备时,都需要由安装厂商提供新的驱动程序。
驱动程序由设备制造商提供
- 设备独立性软件
现代 OS 中的 I/O 系统基本上都实现了与设备无关性,也称为与设备无关的软件。其基本含义是:I/O 软件独立于具体使用的物理设备。
由此带来的最大好处是,提高了 I/O 系统的可适应性和可扩展性。使它们能应用于许多类型的设备,而且在每次增加新设备或替换老设备时,都不需要对 I/O 软件进行修改,这样就方便了系统的更新和扩展。
设备独立性软件的内容包括设备命名、设备分配、数据缓冲和数据高速缓冲一类软件等。
3 I/O 系统接口
3.1 块设备接口
块设备接口是块设备管理程序与高层之间的接口。该接口反映了大部分磁盘存储器和光盘存储器的本质特征,用于控制该类设备的输入或输出。
所谓块设备,是指数据的存取和传输都是以数据块为单位的设备。典型的块设备是磁盘。
该设备的基本特征是传输速率较高,通常每秒钟为数 MB 到数十 MB。另一特征是可寻址,即能指定数据的输入源地址及输出的目标地址,可随机地读/写磁盘中任一块;磁盘设备的 I/O 常采用 DMA 方式。
3.2 流设备接口
流设备接口是流设备管理程序与高层之间的接口。该接口又称为字符设备接口,它反映了大部分字符设备的本质特征,用于控制字符设备的输入或输出。
所谓字符设备,是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。
字符设备的基本特征是传输速率较低,通常为每秒几个字节至数千字节。另一特征是不可寻址,即不能指定数据的输入源地址及输出的目标地址。字符设备在输入/输出时,常采用中断驱动方式。
由于字符设备是不可寻址的,因而对它只能采取顺序存取方式。通常是为字符设备建立一个字符缓冲区(队列),设备的 I/O 字符流顺序地进入字符缓冲区(读入),或从字符缓冲区顺序地送出到设备(输出)。
批量的 I/O 读写,提升 I/O 效率
由于大多数流设备都属于独占设备,必须采取互斥方式实现共享,为此,流设备接口提供了打开和关闭操作。在使用这类设备时,必须先用打开操作来打开设备。如果设备已被打开,则表示它正被其它进程使用。
2.3 网络通信接口
在现代 OS 中,都提供了面向网络的功能。但首先还需要通过某种方式把计算机连接到网络上。同时操作系统也必须提供相应的网络软件和网络通信接口,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。
该部分在网络操作系统中详细介绍