为了提高操作系统的可适应性和可扩展性,目前几乎所有的操作系统都实现了设备的独立性(Device Independence)(也称为设备无关性)。用户程序的设备独立性是:用户程序不直接使用物理设备名(或设备的物理地址),而只能使用逻辑设备名;而系统在实际执行时,将逻辑设备名转换为某个具体的物理设备名,实施I/O操作。I/O软件的设备独立性是:除了直接与设备打交道的低层软件之外,其他部分的软件并不依赖于硬件。I/O软件独立于设备,就可以提高设备管理软件的设计效率。
I/O软件采用分层结构,它把软件组织成为一系列的层,低层参与隔离硬件特征,使其它部分软件不依赖硬件;而高层则参与向用户提供一个友好的、清晰而统一的接口。I/O软件一般共分四层:中断处理程序,设备驱动程序,与设备无关的操作系统软件,以及用户级软件(指用户空间的I/O软件),如图4-9所示。从功能上看,设备无关层是I/O管理的主要部分;从代码量上看,驱动层是I/0管理的主要部分。分层是相对灵活的,一些具体分层时细节上的处理是依赖于系统的。
现代操作系统通过使用重构设备驱动程序技术,简化了驱动程序的安装。这种系统允许安装好新的输入输出设备后,只要增加相应的设备驱动程序到操作系统,而无需编译操作系统,只要通过一些操作来重新配置系统。这种可重构性,是通过允许在操作系统设计中,动态地将操作系统代码与驱动程序结合起来而实现的。
大部分I/0软件都包含在操作系统中,用户程序的I/0软件是有关实现I/O系统调用的库函数和SPOOLing系统等。
所有设备所需要的I/O功能在与设备无关的软件中实现,这类设备无关性软件面向应用层并提供一个统一的应用编程接口(API),它提供了一组功能函数,应用程序员能够通过调用它们管理设备。这个接口是设备硬件的一个大大简化了的简单抽象的接口,提供的是对具有逻辑性质的逻辑设备上的逻辑操作。由文件系统和设备管理功能接受、翻译、转换为相应的物理设备、物理性质、物理操作。与设备无关的系统软件实现的功能有:设备驱动程序的统一接口,设备命名,设备保护,提供一个与设备无关的逻辑块,缓冲,存储设备的块分配,独占设备的分配和释放,错误处理等。
设备驱动程序的主要功能将来自上层软件的与设备无关的的抽象请求转为具体请求,向有关的输入输出设备的各种控制器的寄存器发出控制命令,并监督它们的正确执行,进行必要的错误处理。还要对各种可能的有关设备排队、挂起、唤醒等操作进行处理,执行确定的缓冲区策略等。
一旦CPU响应中断,转人中断处理程序。中断处理程序首先唤醒驱动程序检查响应中断的条件是否满足,如果响应中断,则关中断,保存被中断进程现场,分析中断原因,调用并执行中断处理子程序,最后退出中断,恢复现场,开中断。
中断方式I/O处理
在使用中断的微机系统中,执行输入请求的处理步骤如图4-11所示。
(1)应用进程请求读操作。
(2)设备启动程序(设备驱动程序的上半部分)查询设备控制器的状态寄存器,确定设备是否空闲;如果设备忙,则设备启动程序等待,直到它变为空闲为止。
(3)设备启动程序把输入命令存人设备控制器的命令寄存器中,从而启动设备。
(4)设备启动程序将相应信息写入到设备状态表的设备对应表项中,如最初调用的返回地址,以及I/O操作的一些特定参数等。然后CPU就可以分配给其他进程使用了,因此设备管理器调用进程管理器的调度程序执行,原进程的执行就被暂停了。
(5)经过一段时间设备完成了I/O操作后,设备控制器发出中断请求,中断CPU上运行的进程,从而引起CPU运行中断处理程序。
(6)中断处理程序确定是哪个设备引起的中断,然后转移到该设备对应的设备处理程序(设备驱动程序的下半部分)执行(唤醒设备驱动程序)。
(7)设备处理程序重新从设备状态表中,找到等待I/O操作的状态信息。
(8)设备处理程序拷贝设备控制器的数据寄存器的内容到用户进程的内存区。
(9)设备处理程序返回给应用进程控制权,从而继续运行。
在以上处理I/O操作过程中,中断处理程序和设备处理程序二程序一起完成对中断请求的处理,但二者工作方式不同,前者必须关中断运行,或是以高优先权方式运行;而后者可以开中断运行,或以低优先权方式运行。这种把“长” 中断服务程序分成二个程序的方法是为了减少系统对I/O处理的响应时间。要保证随时可能发生的中断信号不被丢失,要及时做一些信号的保存,读取甚至传递工作,这一阶段的工作要求快速处理,采用关中断方式运行,将其称为中断处理的低级阶段。而那些与设备有关的数据结构的处理,它要花费中断处理的大部分时间,采用开中断运行,将其称为中断处理的高级阶段。
用户空间的软件I/O――SPOOLing系统
早期批处理系统中使用的虚拟技术是以脱机方式工作的。为了缓和CPU和I/O设备之间的速度不比配的问题。利用专门的外围控制机将低速I/O设备上的数据传送到高速共享型设备如磁盘上,或者相反。当多道程序设计的分时系统出现后,SPOOLing技术就孕育而生,它将一台独占设备改造成可以共享的虚拟设备。
1.什么是 SPOOLing技术
当多道程序程序技术出现后,就可以利用一道程序,来模拟脱机输入时的外围控制机的功能,即把低速I/O设备上的数据传送到高速的磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,即把数据从磁盘传送到低速I/O设备上。这样,便在主机的直接控制下,实现脱机输入、输出功能。所以,我们把这种在联机情况下实现的同时与外围设备联机操作的技术称为SPOOLing(Simultaneous Peripheral Operation On Line)技术,或称为假脱机技术,SPOOLing技术是一种虚拟设备技术。
2.SPOOLing系统的组成
SPOOLing系统是对脱机输入、输出工作的模拟,它必须有高速随机存取的外存(硬盘)支持。 SPOOLing系统主要有以下三部分(如图4-12所示):
(1)输入井和输出井
在磁盘上开辟的两个大的存储空间。输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
(2)输入缓冲区和输出缓冲区
在内存中开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,再传送给输出设备。
(3)输入进程SPi和输出进程SPo
进程SPi 模拟脱机输入时的外围控制机,在输入设备空闲时,将用户要求的数据预先从输入机通过输入缓冲区再送到输入井。当CPU需要输入数据时,直接从输入井读入内存。SPo 进程模拟脱机输出时的外围控制机,把用户要求输出的数据,随时从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备上。
3.共享打印机
打印机虽然是独享设备。但是通过SPOOLing技术,可以将它改造为一台可供多个用户共享的设备,共享打印机技术已被广泛地用于多用户系统和局域网络。为此,SPOOLing系统创建一个特殊进程,称为守护(daemon)进程,以及一个特殊目录,称为SPOOLing目录。当用户进程请求打印输出时,SPOOLing系统并不是真正把打印机分配给该用户进程,而由守护进程为它在磁盘中申请一个存储空间,并将要打印的数据以文件的形式存放于SPOOLing目录下。然后由守护进程依次完成该目录下文件的打印工作,该进程是唯一一个拥有使用打印机特殊文件权限的进程。
总之,利用SPOOLing技术可以提高I/O的效率,将独占设备改造为共享设备,实现虚拟设备的功能。