计算机的两大任主要工作是处理和I/O。
计算机的操作系统I/O功能是,管理和控制I/O操作和I/O设备。
因为I/O设备的功能与速度差异很大,所以需要采用不同的方法来控制设备。
这些方法构成了I/O子系统,以便内核的其他部分不必涉及I/O设备管理的复杂性。
为了封装各种设备的细节与特点,操作系统内核采用设备驱动程序模块,设备驱动程序(device driver)为I/O子系统提供了统一的设备访问接口,就像系统调用为应用程序与操作系统之间提供的标准接口。
尽管I/O设备的种类如此之多,但是仅需少数几个概念,就能理解设备是如何连接以及软件如何控制硬件。
端口:设备与计算机的通信通过一个连接点或端口。
控制器:控制器是可以操作端口、总线或设备的一组电子器件。(如,串行端口控制器、SCSI总线控制器)。
I/O端口寄存器:I/O端口通常由四个寄存器组成,即状态、控制、数据输入、数据输出寄存器。
主机与控制器之间的交互可以有以下三种方式:
每种设备都有自己的功能集、控制位的定义及与主机交互的协议,这些都是不同的。
如何设计操作系统,以便新的外设可以连接到计算机而不必重写操作系统?
设备种类繁多,操作系统又是如何提供一个统一、方便的应用程序的I/O接口?
本节讨论操作系统的架构与接口,以便按统一的方式来处理I/O设备。
涉及到抽象、封装与软件分层。
设备驱动程序一方面可以定制以适应各种设备,另一方面也提供一组标准接口。
设备驱动程序层的作用是,为内核I/O子系统隐藏设备控制器之间的差异。
I/O子系统与硬件的分离简化了操作系统开发人员的工作。
也有利于硬件制造商,它们可以设计新的硬件与现有主机控制器接口兼容,也可以编写设备驱动程序已将新的硬件连到流行的操作系统。
这样可以将新的外设连到计算机,而无需等待操作系统供应商来开发支持代码。
由于I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制。这些方法共同组成了操作系统内核的I/O子系统,它将内核的其他方面从繁重的I/O设备管理中解放出来。
I/O核心子系统提供的服务主要有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等。
(1)I/O调度
应用程序执行系统调用的顺序很少是最佳的。
I/O调度可以改善系统整体性能,减少I/O完成所需的平均等待时间。
就比如说现在磁盘的磁头在磁盘的开始的位置,三个应用程序向这个磁盘发布阻塞的读调用,应用程序1需要磁盘结束部分的块,应用程序2需要磁盘开始部分的块,应用程序3需要磁盘中间部分的块。操作系统如果按照2、3、1的顺序进行处理,则可以降低磁头所需要移动的距离。按照这种方式来重新排列服务顺序就是I/O调度的核心。
操作系统为每个设备维护一个请求等待队列。当应用程序发出阻塞I/O的系统调用时,该请求被添加到相应设备的请求队列。
I/O调度程序重新安排队列顺序,以便提高系统的总体效率和应用程序的平均响应时间。
I/O调度是I/O子系统提高计算机效率的一种方法。
(2)缓冲
缓冲区(buffer)是一块内存区域,用于保存两个设备之间或在设备与应用程序之间传输的数据。
缓冲区的 3 个作用:
(3)缓存
缓存(cache)是保存数据副本的高速内存区域。
缓存和缓冲功能不同,但是有时一个内存区域可以用于两个目的。
区别
Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
简单来说就是buffer偏重于写,而cache偏重于读。
(4)假脱机[ spool ]与设备预留
假脱机(spool)是保存设备输出的缓冲区。这些设备,如打印机,不能接收交叉的数据流。是操作系统中釆用的一项将独占设备改造成共享设备的技术。
虽然打印机只能一次打印一个任务,但是多个应用程序可能希望并发打印输出,而不能让它们的输出混到一起。操作系统通过拦截所有打印输出,来解决这一问题。
应用程序的输出先是假脱机到一个单独的磁盘文件。当应用程序完成打印时,假脱机系统排序相应的假脱机文件,以便输出到打印机。
假脱机系统的组成
输入井和输出井
在磁盘上开辟出的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容I/O设备输 入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
输入缓冲区和输出缓冲区
在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送 到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
输入进程和输出进程
输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再 送到输入井。当CPU需要输入数据时,直接将数据从输入井读入内存。输出进程模拟脱机 输出时的外围控制机,把用户要求输出的数据先从内存送到输出并,待输出设备空闲时,再 将输出井中的数据经过输出缓冲区送到输出设备。
共享打印机是使用SPOOLing技术的一个实例,这项技术已被广泛地用于多用户系统和 局域网络中。当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正 立即把打印机分配给该用户进程,而只为它做两件事: