操作系统——I/O设备管理(2)

I/O软件(与输入输出有关的软件)

为了更好地管理系统中的输入输出设备,我们需要哪一些软件?这些软件各自完成什么样的功能?它们之间的相互关系、组织结构是什么?在这些软件中,程序员负责做什么?操作系统负责做什么?I/O设备厂商负责做什么?

1、I/O软件的接口

与I/O软件有关的角色有三个:应用程序的开发人员,操作系统的设计者和I/O设备厂商。
I/O软件的接口:一个是应用程序与操作系统之间的接口,另一个是操作系统与I/O设备之间的接口。

1.1、应用程序与操作系统之间的接口

操作系统 提供一个应用程序编程接口(Application Programming  Interface ,API),让编程人员调用。

接口的目标:
  • 设备独立性:用户在编写程序、访问各种I/O设备时,无需事先指定特定设备的类型。
  • 统一命名:用简单的字符串或整数的方式来命名一个文件或设备。在UNIX系统中,命名的规则就是路径名。
  • 阻塞与非阻塞I/O:我们希望操作系统提供的API函数分为两类,一类是阻塞性的,即进程启动一个系统调用后,会被阻塞起来,直到I/O操作完成。另一类是非阻塞性的,即当进程启动一个系统调用后,不管I/O操作是否完成,都会立即返回。

1.2、操作系统与I/O设备的接口

在操作系统和设备驱动之间,也有一个接口。对于每一种I/O设备来说,它的设备驱动程序是由硬件厂商提供的。
为了实现设备的独立性,操作系统将各种类型的设备分为三类:块设备、字符设备和网络设备,并为每一类设备定义了一个标准接口。





例如:文件系统处理的就是抽象的块设备。文件系统是操作系统的一部分,它就是位于上层的I/O软件中,然后它调用的就是这些抽象的接口函数,如读写一个数据块。
文件系统并不会直接去控制I/O操作,也不去管这些接口函数是如何实现的,它就是通过这些抽象的接口函数来与底层的硬件打交道,这样才能实现设备的独立性。

那些在这些接口中都包含哪些函数?

  • 无论是哪一种设备,无论是块设备还是字符设备,都需要一些共同的接口函数,(虽然函数的具体实现是不一样的,但是函数的类型是一样的)例如
open(deviceNumber):启动设备,初始化并分配资源,如缓冲区
close( deviceNumber )  :关闭设备,释放资源
  • 对于字符设备,主要的接口函数包括:
read(deviceNumber, buffer, size):从一个字节流设备中读入size个字节,写入到buffer缓冲区中。
write(deviceNumber, buffer, size):从buffer缓冲区中取出size个字节,写入到一个字节流设备中。
  • 对于块设备,主要的接口函数包括:
read(deviceNumber, deviceAddr, buffer):从设备地址deviceAddr处读入一个数据块到buffer缓冲区。
write(deviceNumber, deviceAddr, buffer):把buffer中的数据块写入到设备地址deviceAddr。
seek(deviceNumber,, deviceAddress):把设备的访问指针定位到正确的位置。

2、I/O软件的层次结构


I/O软件的层次结构
               用户空间的I/O软件
              设备独立的系统软件
                  设备驱动程序
                   中断处理程序
                          硬件

2.1、中断处理程序

在I/O软件中最底层的是中断处理程序。当I/O设备完成一次I/O操作时,设备控制器会向中断控制器发信号,然后中断控制器再向CPU发信号,从而触发一次中断。

2.2、设备驱动程序

设备驱动程序是与具体的设备类型密切相关的,用来控制设备运行的程序。它一般是由生产厂商提供的。
在I/O软件中,真正与I/O设备密切相关的,直接对它们进行控制的软件,就是设备驱动程序。只有它才会去对设备控制器中的寄存器进行操作,去读状态命令,去写控制命令。
每一个I/O设备都需要相应的设备驱动程序,而每一个设备驱动程序一般也只能处理一种类型的设备。

设备驱动程序在具体实现时,会执行一些步骤:

  • 初始化,如打开设备。
  • 解释系统的命令,检查输入的参数是否有效。如果无效,则返回一个出错的报告;如果有效,则把输入的抽象参数转换为控制设备所需要的具体参数。
  • 检查设备当前是否空闲,如果设备正忙,则这一次的操作请求暂时无法完成,因此把它加入到等待队列,稍后再处理。如果空闲,再检查硬件的状态,看能够开始运行。
  • 设备驱动程序向设备控制器发出一连串的命令,即把这些命令写入到控制器的各个寄存器中,通过端口地址写进去。
  • 当这个I/O操作完成以后,驱动程序会去检查出错的情况。如果一切正常,则程序运行结束,并返回一些状态信息给它的调用者。如果是一个输入操作,那么还要把输入的数据上传到上一层的系统软件。

2.3、设备独立的I/O软件(系统软件)

在设备驱动程序的上一层,是设备独立的I/O软件,它是系统内核的一部分。
真正的I/O操作是由设备驱动程序来完成的,而设备驱动程序是由硬件厂商提供的,那么对于操作系统的设计者来说,在系统的内核中,需要做以下几个方面与I/O有关的事情:
  • 定义并实现与上层应用程序之间的一个统一接口
  • 定义并实现与设备驱动程序的统一接口
  • 提供与设备无关的数据块大小
  • 缓冲技术
我们知道,在CPU和内存之间存在缓冲,这个缓冲位于CPU内部的高速缓存Cache,即为了减少对内存的访问次数,提高内存的访问速度,可以把常用的一些数据保存在Cache中。而 在CPU和磁盘设备之间也有缓冲,这个缓冲位于内存中,即为了减少对磁盘的访问次数,提高磁盘的访问速度,可以把常用的一些数据块保存在内存中。

2.4、用户空间的I/O软件

前面介绍的各种I/O软件,都位于操作系统内核中,是操作系统的一部分。但也有另外一部分I/O软件,并不在系统内核中。这主要有两种:
  • 库函数:与用户程序进行链接的库函数。
  • Spooling技术这是一种完全运行在用户空间中的程序,它是在多道系统中,一种处理独占设备的方法。
SPOOLing(Simultaneous  Peripheral Operation On Line)一般称为假脱机技术,或者虚拟设备技术。 它可以把一个独占设备转变为具有共享特征的虚拟设备,从而提高设备的利用率。
它的基本思路是:在多道系统中,对于每一个独占的设备,专门利用一道程序,即SPOOLing程序,来完成对这个设备的输入输出操作。


                                                                                SPOOLing技术


具体来说:
  • 一方面,SPOOLing程序负责与这个独占的I/O设备进行数据交换,这可以成为“实际的I/O”。如果这是一个输入设备,那么SPOOLing程序预先从该设备输入数据并加以缓冲,然后在需要时再交给应用程序。如果这是一个输出设备,那么SPOOLing程序会接受应用程序的输出数据并加以缓冲,然后在适当的时候再输出到该设备。
  • 另一方面,应用程序在进行I/O操作时,只是与SPOOLing程序交换数据,这可以称为“虚拟的I/O”。
SPOOLing技术的优点:
  • 高速的虚拟I/O操作:应用程序的虚拟I/O比实际的I/O速度要快,因为它只是在两个进程之前的一种通信,把数据从一个进程交给另一个进程。这种交换是在内存中进行的,而不是真正地让机械的物理设备去运作。这就缩短了应用程序的执行时间。
  • 实现对独占设备的共享:由SPOOLing程序提供虚拟设备,然后各个用户进程就可以对这个独占设备依次地共享使用。
例子:
打印机就是一种独占设备,在任何时候只能允许一个用户进程使用。在现代操作系统中,对于打印机设备,普遍采用了SPOOLing技术。具体来说,首先创建一个SPOOLing进程,或称后台打印程序,以及一个SPOOLing目录。当一个进程需要打印一个文件时,首先会生成将要打印的文件,并把它放入到SPOOLing目录中,然后由这个后台打印进程来负责真正的打印操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值