操作系统核心原理-7.设备管理:I/O原理

一、I/O的基本知识

1.1 为何要有I/O

  前面阐述了操作系统具有进程管理、内存管理、外存管理三大核心功能,但是计算机归根是为人类服务的,这就要求计算机必须提供某种机制使得人们可以向计算机发出命令或操纵计算机。也就是说计算机与人之间必须存在某种沟通的机制,这种沟通的机制就是计算机的输入输出机制。输入输出的存在才使得计算机的存在有了意义,就像一个人,如果没有输入输出,那么就不能与外部世界打交道。

  (1)输入提供的是一个“人→计算机”的通道,即人或外部世界通过输入向计算机发出命令或提供数据。

  (2)输出提供的是一个“计算机→人”的通道,计算机通过这个通道向人祸外部世界输出自己的计算机结果。

1.2 I/O管理要达到的目的

  简单来说,I/O就是提供一个人际交互的通道,使得人和计算机能够进行沟通。具体来说,I/O的目的有以下两点:

  (1)屏蔽输入输出设备的差异:提供一个统一的界面来屏蔽输入输出设备的差异

  (2)在不同设计之间进行数据表示的转换:数据能够在不同设备之间相互转换而无需用户操心

二、I/O的硬件和软件

2.1 I/O的硬件

  所有的I/O设备均可以分为两个大类:块设备字符设备。块设备是以数据块为单位存储和传输数据的输入输出设备,如磁盘、光盘、U盘等;而字符设备则是将数据按照字符为单位来存放和传输的设备,如鼠标、键盘、打印机等等。

  (1)I/O设备的差异性

  I/O设备由于种类不同、制造商不同、技术标准不同,其特性可以有巨大的不同。因此,屏蔽这些巨大的不同,使得不同的设备相互共存并不是一件容易的事情。

  (2)设备控制器

  I/O设备本身并不是一个不可分割的整体,而是由不同的部件构成。一般来说,一个I/O设备至少可以分为两部分:机械部分和电子部分。机械部分是设备的物理硬件部分,而电子部分则是设备的控制器。控制器可以处理多个设备,或者说多个同类的设备可以共用一个控制器,如下图所示:

I/O Controllers

2.2 I/O的软件

  除了有了I/O的硬件是不够的,毕竟,对于用户来说,直接对硬件进行操作十分困难。我们知道,操作系统的角色是魔术师和管理者,魔术是将不同I/O设备的差异屏蔽,使它们看上去似乎是一样的东西,都具有令人赏心悦目的界面;而管理则是对这些设备进行管理,该独享的独享,该共用的共用,需要缓冲的缓冲,并对设备进行实际的驱动(发出读写命令)。

  具体来说,I/O软件的目标如下:

  (1)设备独立:程序对I/O设备的访问不依赖于设备的物理特征,且在I/O程序的编写时无须事先指定I/O设备。

  (2)统一命名:设备或文件的命名不依赖于具体的计算机,这样使用名字将使程序可以在任何机器上运行;

  (3)错误处理:对输入输出过程中产生的数据错误进行侦测与纠正,而且纠错应该在最靠近硬件的层面上进行;

  (4)数据传输:实际操控数据在主机和外设之间的传递;

  (5)缓冲:为数据传输提供一个临时存放地,然后在方便时将数据拷贝到最后目的地。

  (6)共用与独享:将设备尽量变为共享,以增大资源利用率和降低死锁发生的概率。例如,将磁盘、打印机变为共享。

三、I/O软件的分层

  为了完成一个繁琐的工作,人们通常将其分为更小的任务来处理。在I/O软件上自然也不会例外。I/O软件通常按照I/O功能进行分层,每一层有提供独特的功能,并与相邻的层面设计有标准界面。一般来说,I/O软件都有以下几层:

  (1)用户层I/O软件

  (2)设备独立的操作系统软件

  (3)设备驱动程序

  (4)中断服务程序

3.1 中断服务程序

  由于大多数I/O均为中断驱动,中断驱动服务程序就称为绝大部分I/O软件的不可分割的部分。中断服务程序由于直接与硬件相关,因此针对不同的I/O硬件,中断响应的处理方式也不尽相同。因此,中断服务程序是I/O软件系统分层里面的最底层。

3.2 设备驱动程序

  设备驱动程序顾名思义就是直接驱动I/O设备进行输入或输出操作的软件。它属于与设备控制器直接联系的I/O软件部分,与具体的I/O设备直接相关,并针对每个特定的I/O设备进行优化。

3.3 设备独立的操作系统软件

  设备驱动程序并不直接从用户处接收I/O请求,而是通过操作系统软件获得的。操作系统在设计时之所以有这层软件是因为I/O软件的一部分与设备有关,一部分与设备无关。而如果与设备无关,就可以将这部分共用起来,放置在设备驱动程序之上,为用户提供一个统一的I/O界面。

3.4 用户层I/O软件

  设备驱动程序从设备独立的操作系统软件层接收I/O请求,而设备独立的操作系统软件则从用户或应用软件处接收指令。这时,还差一个发出指令的界面,这个界面就是用户层I/O软件。我们可能大多数都见过在一段C程序中

    count = write(fd, buffer, nbytes)

  这一句命令就是用户层I/O软件的一部分,write是一个由高级语言提供的库函数,用户与这个库函数打交道,而这个库函数在编译之后会变成一系列指令,来完成系统调用过程。

参考资料

邹恒明,《操作系统之哲学原理》,机械工业出版社

 

posted @ 2016-01-24 02:19 Edison Chou 阅读(...) 评论(...) 编辑 收藏