写在前面:
- 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
- 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili
一、I/O系统的基本功能
I/O系统管理的主要对象是I/O设备和相应的设备控制器,其最主要的任务是完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,并能为更髙层的进程方便地使用这些设备提供手段。
1、隐藏物理设备的细节
I/O设备的类型非常多,且彼此间在多方面都有差异,诸如它们接收和产生数据的速度、传输方向、粒度、数据的表示形式及可靠性等方面。为了对这些千差万别的设备进行控制,通常都为它们配置相应的设备控制器。
设备控制器是一种硬件设备,其中包含有若干个用于存放控制命令的寄存器和存放参数的寄存器,用户通过这些命令和参数,可以控制外部设备执行所要求的操作。显然,对于不同的设备,需要有不同的命令和参数,如果要求程序员或用户编写直接面向这些设备的程序是很困难的,因此I/O系统必须通过对设备加以适当的抽象,以隐藏掉物理设备的实现细节,仅向上层进程提供少量的、抽象的读/写命令,如read、write等。
2、与设备的无关性
一方面,用户不仅可以使用抽象的I/O命令,还可使用抽象的逻辑设备名来使用设备,例如当用户要输出打印时,他只须提供读(或写)的命令(提出对I/O的要求)和抽象的逻辑设备名,而不必指明是哪一台打印机;另一方面,也可以有效地提高OS的可移植性和易适应性,对于OS本身而言,应允许在不需要将整个操作系统进行重新编译的情况下,增添新的设备驱动程序,以方便新的I/O设备的安装。
3、提高处理机和I/O设备的利用率
在一般的系统中,许多I/O设备间是相互独立的,能够并行操作,在处理机与设备之间也能并行操作,因此I/O系统的第三个功能是要尽可能地让处理机和I/O设备并行操作,以提高它们的利用率。为此,一方面要求处理机能快速响应用户的I/O请求,使I/O设备尽快地运行起来,另一方面也应尽量减少在每个I/O设备运行时处理机的干预时间。
4、对I/O设备进行控制
对I/O设备进行控制是驱动程序的功能。目前对I/O设备有四种控制方式:采用轮询的可编程I/O方式、采用中断的可编程I/O方式、直接存储器访问方式、I/O通道方式。
5、确保对设备的正确共享
从设备的共享属性上,可将系统中的设备分为如下几类:
①独占设备,进程应互斥地访问这类设备,即系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。
②共享设备,是指在一段时间内允许多个进程同时访问的设备(某一时刻只允许一个进程访问)。
③虚拟设备,指通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用。
6、错误处理
大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。从处理的角度,可将错误分为临时性错误和持久性错误。对于临时性错误,可通过重试操作来纠正,只有在发生了持久性错误时,才需要向上层报告。
由于多数错误是与设备紧密相关的,因此对于错误的处理,应该尽可能在接近硬件的层面上进行,即在低层软件能够解决的错误就不向上层报告,因此高层也就不能感知,只有低层软件解决不了的错误才向上层报告,请求高层软件解决。
二、I/O系统的层次结构和模型
将系统中的设备管理模块分为若干个层次,每一层都是利用其下层提供的服务,完成输入输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。通常把I/O软件组织成四个层次,各层次及其功能如下:
①用户层I/O软件:实现与用户交互的接口,用户可直接调用该层所提供的、与I/O操作有关的库函数对设备进行操作。
②设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
③设备驱动程序:它处于I/O系统的次底层,与硬件直接相关,是进程和设备控制器之间的通信程序,其主要功能是将上层发来的抽象I/O请求转换为对I/O设备的具体命令和参数,并把它装入到设备控制器中的命令和参数寄存器中,或者相反。
④中断处理程序:它处于I/O系统的底层,直接与硬件进行交互,当有I/O设备发来中断请求信号时,在中断硬件做了初步处理后,便转向中断处理程序进行处理,处理完毕再恢复被中断进程的现场后,返回到被中断的进程。
设备独立性软件、设备驱动程序和中断处理程序属于OS的内核部分,即“I/O系统”。
三、I/O系统接口
1、块设备接口
所谓块设备,是指数据的存取和传输都是以数据块为单位的设备,典型的块设备是磁盘。块设备的基本特征是传输速率较高,通常每秒钟为数MB到数十MB;另一特征是可寻址,即能指定数据的输入源地址及输出的目标地址,可随机地读/写盘中任一块。
块设备接口是块设备管理程序与高层之间的接口,该接口反映了大部分磁盘存储器和光盘存储器的本质特征,用于控制该类设备的输入或输出。块设备在输入输出时,常采用DMA方式。
块设备接口将磁盘上的所有扇区从0到n-1依次编号,n是磁盘中的扇区总数,经过这样编号后,就把磁盘的二维结构改变为一种线性序列,在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示,或者说,块设各接口隐藏了盘地址是二维结构的情况。
块设备接口支持上层发来的对文件或设备的打开、读、写和关闭等抽象命令,该接口将上达命令映射为设备能识别的较低层具体操作,例如上层发来读磁盘命令时,它先将抽象命令中的逻辑块号转换为磁盘的盘面、道和区等。
2、流设备接口
流设备又称字符设备,所谓字符设备,是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。字符设备的基本特征是传输速率较低,通常为每秒几个字节至数千字节;另一特征是不可寻址,即不能指定数据的输入源地址及输出的目标地址。字符设备在输入输出时,常采用中断驱动方式。
由于字符设备是不可寻址的,因而对它只能采取顺序存取方式。通常是为字符设备建立一个字符援冲区(队列),设备的I/O字符流顺序地进入字符缓冲区(读入),或从字符缓冲区顺序地送出到设备(输出)。用户程序获取或输出字符的方法是采用get和put操作,get操作用于从字符缓冲区取得一个字符(到内存),将它返回给调用者,而put操作则用于把一个新字符(从内存)输出到字符缓冲区中,以待送出到设备。
因字符设备的类型非常多,且差异甚大,为了以统一的方式来处理它们,通常在流设备接口中提供了一种通用的in-control指令,在该指令中包含了许多参数,每个参数表示一个与具体设备相关的特定功能。
由于大多数流设备都属于独占设备,必须采取互斥方式实现共享,为此流设备接口提供了打开和关闭操作,在使用这类设备时,必须先用打开操作来打开设备,如果设备已被打开,则表示它正被其它进程使用。
3、网络通信接口
在现代OS中都提供了面向网络的功能,但首先还需要通过某种方式把计算机连接到网络上,同时操作系统也必须提供相应的网络软件和网络通信接口,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。