笔记内容及图片整理自XJTUSE “操作系统” 课程ppt,仅供学习交流使用,谢谢。
概述
计算机的两个主要工作是I/O和处理。I/O系统的目标是提高设备利用率,尽量提高CPU与I/O设备间的并行工作程度,I/O主要技术包括中断技术、DMA技术、通道技术、缓冲技术。I/O系统能为用户提供方便(用户能独立于具体设备的复杂物理特性之外而方便地使用设备)、统一(对不同设备尽量使用统一操作方式,例如各种字符设备用一种I/O操作方式)的界面。
I/O设备技术呈现两个冲突趋势。一方面,软件和硬件的接口标准化日益增长,有助于将改进升级设备集成到现有计算机和操作系统;另一方面,I/O设备的种类也日益增多,新设备和原先设备的巨大差异导致难以集成到现有计算机和操作系统。解决这种冲突需要采用硬件和软件的组合技术。为了封装各种设备的细节与特点,操作系统内核采用设备驱动程序模块。设备驱动程序为I/O子系统提供了统一的设备访问接口,就像系统调用为应用程序与操作系统间提供了标准接口。
I/O硬件
计算机系统中,除了需要直接用于I/O和存储信息的设备外,还需要有相应的设备控制器。对于大、中型计算机系统,还需有I/O通道,由这些设备以及相应的总线构成了I/O系统。设备与计算机的通信通过一个连接点或端口实现,若设备共享一组通用线路,则这种连接称为总线,总线是一组线路和通过线路传输信息的严格定义的一个协议。若设备A通过线路连接设备B,设备B又通过线路连接设备C,设备C通过端口连接计算机,则此方式被称为菊花链,菊花链通常按照总线运行。
以下是一个典型的PC总线结构:
I/O设备类型繁多,从操作系统的角度看,其性能指标包括数据传输速率、数据传输单位和设备共享属性等。
数据传输速率:
低速设备——传输速率仅为每秒钟几个字节至数百个字节。属于低速设备的典型设备有键盘、 鼠标器、语音的输入和输出等设备。
中速设备——传输速率在每秒钟数千个字节至数万个字节。典型的中速设备有行式打印机、激光打印机等。
高速设备——传输速率在数百K个字节至数十兆字节。 典型的高速设备有磁带机、磁盘机、光盘机等。
数据传输单位:
块设备——用于存储信息。 由于信息的存取总是以数据块为单位,故而得名。 典型的块设备是磁盘,每个盘块的大小为512B~4KB。磁盘设备的基本特征是其传输速率较高,通常每秒钟为几兆位;另一特征是可寻址,即对它可随机地读/写任一块;此外,磁盘设备的I/O常采用DMA 方式。
字符设备——用于数据的输入和输出。其基本单位是字符,故称为字符设备。
设备共享属性:
独占设备——在一段时间内只能有一个进程使用的设备,一般为低速I/O设备(如打印机,磁带等)
共享设备——在一段时间内可有多个进程共同使用的设备,多个进程以交叉的方式来使用设备,其资源利用率高(如硬盘)
虚拟设备——通过虚拟技术把一台独占设备变换为若干台逻辑设备,可供多个用户使用。
控制器:设备并不是直接与CPU进行通信,而是与设备控制器通信。每个 I/O 设备通过设备控制器与计算机的数据总线和地址总线相连接,某些设备(磁盘设备)有内置的控制器。
设备控制器是一个可编址设备,由设备控制器与CPU的接口、设备控制器与设备的接口和I/O逻辑组成。当它仅控制一个设备时,它只有一个唯一的设备地址;若控制器可连接多个设备时,则应具有多个设备地址,使每一个地址对应一个设备。它还是CPU与I/O设备间的接口,它接收从CPU发来的命令,并去控制I/O设备工作。
I/O通道:通道位于CPU和设备控制器之间,是独立于CPU的专门负责数据I/O传输工作的处理机,对外部设备实现统一管理,代替CPU对I/O操作进行控制,从而使I/O操作可与CPU并行操作。通道可以执行通道程序,建立独立的I/O操作,不仅使数据的传送独立于CPU,而且使有关对I/O操作的组织、管理及其结束处理也尽量独立,即把CPU从繁杂的I/O任务中解放出来,提高CPU与设备,设备与设备之间的并行工作能力。
字节多路通道——主要连接以字节为单位的低速I/O设备(打印机、终端),以字节为单位传输信息,含有多个非分配型子通道,可以分时地执行多个通道程序。当一个通道程序控制某台设备传送一个字节后,通道硬件就控制转去执行另一个通道程序,控制另一台设备传送信息。
数组选择通道——主要连接磁盘,磁带等高速I/O设备,以数组方式工作,即每次传送一批数据,传送速度很高。数组选择通道只含有一个分配型子通道,在一段时间内只能执行一个通道程序,只允许一台设备进行数据传输。当这台设备数据传输完成后,再选择与通道连接的另一台设备,执行它的相应的通道程序。
瓶颈问题:由于通道价格昂贵,致使机器中所设置的通道数量势必较少,这又往往使它成为I/O 的瓶颈,造成整个系统吞吐量的下降。解决瓶颈问题的最有效方法是增加设备到主机间的通路,而不增加通道。
I/O控制方式的发展宗旨是尽量减少主机对I/O控制的干预,把主机从I/O控制事务中解放出来。主要的四种I/O控制方式包括程序I/O方式(轮询)、中断驱动I/O、直接内存访问DMA控制方式和I/O通道控制方式。
轮询
早期计算机系统中无中断机构,处理机对I/O设备的控制采取程序I/O方式,即轮询。
轮询在进行数据I/O之前先查询设备的状态
——已准备好?传送数据
——未准备好?继续查询
是否准备好的依据为设备控制器的状态位
——Busy=1?未准备好
——Busy=0?已准备好
轮询模式中CPU与设备串行工作、循环测试,浪费大量CPU时间。
中断
现代计算机系统中对I/O设备的控制广泛采用中断驱动方式,即在I/O设备输入/输出每个数据的过程无须CPU干预,仅当输完一个数据时,才需CPU花费极短时间去做些中断处理。
1)CPU向设备控制器发出一条I/O命令后,立即返回继续执行原来的任务
2)设备控制器控制I/O设备进行I/O操作
3)当设备完成了一个字节数据的I/O时,设备控制器产生一个中断信号
4)CPU检测到中断信号后,进行相应的处理工作。
中断模式中CPU与I/O设备并行工作,仅当输完一个数据时才需CPU花费极短时间做中断处理,提高了系统的资源利用率及吞吐量。
直接内存访问
中断驱动方式以字节为单位进行I/O,若将这种方式用于块设备I/O,显然极其低效。因此为了进一步减少CPU对I/O的干预,引入直接内存访问DMA方式。此方式拥有一个专用的DMA控制器,启动DMA传输时主机将DMA命令块(包含传输来源地址的指针、传输目标地址的指针、传输字节数)写到内存,CPU将DMA命令块地址写到DMA控制器后便继续其他工作。DMA控制器继续直接操作内存总线,将地址放到总线,在没有主CPU的帮助的情况下执行传输。
DMA控制器由主机与DMA控制器接口、DMA控制器与块设备接口和I/O控制逻辑组成,DMA控制器中设四类寄存器:命令/状态寄存器CR、内存地址寄存器MAR、数据寄存器DR、数据计数器DC。
DMA方式中,数据传输的基本单位是数据块,所传输的数据是从设备直接送入内存或者从内存直接读入设备,整块数据的传送是由控制器完成的。这种方式较中断驱动方式成百倍地减少了CPU对I/O的干预,进一步提高了CPU与I/O设备的并行操作程度。
I/O通道
DMA每次只能执行一条I/O指令,不能满足复杂的I/O操作要求。大、中型计算机系统中普遍采用由专用I/O处理机来接受CPU的委托,独立执行自己的通道程序来实现I/O设备与内存之间的信息交换,这就是I/O通道技术。
I/O通道方式是DMA方式的发展,它进一步减少了CPU的干预,即将以一个数据块的I/O为单位的干预减少到以一组数据块的I/O及有关的控制和管理为单位的干预,从而实现CPU、通道和I/O设备三者的并行工作。
例如当CPU要完成一组相关的I/O操作及有关控制时,只需向I/O通道发出一条I/O指令,并给出通道程序的首地址和要访问的I/O设备,通道接到该指令后,通过执行通道程序便可自动完成CPU指定的I/O任务。通道相当于一个功能简单的处理机,包含通道指令(空操作,读操作,写操作,控制,转移操作),并可执行用这些指令编写的通道程序。
内核I/O子系统
缓冲
缓冲技术:为提高I/O速度和设备的利用率,几乎所有I/O设备在与CPU/内存交换数据时,都使用了缓冲区。引入缓冲技术的主要原因有以下三点:
1)缓和CPU与I/O设备间速度不匹配的矛盾
2)减少对CPU的中断频率,放宽对中断响应时间的限制
3)提高CPU和I/O设备之间的并行性
例如一个程序,它时而长时间计算而没有输出,时而阵发性把输出送到打印机。由于打印机速度跟不上CPU,这导致CPU长时间等待。如果设置了缓冲区,程序输出数据先送到缓冲区暂存,然后由打印机慢慢地输出,则CPU不必等待,可以继续执行程序。实现了CPU与I/O设备之间的并行工作。操作系统提供的缓冲形式有单缓冲、双缓冲、循环缓冲和缓冲池。
缓冲池:循环缓冲属于专用缓冲。当系统较大时,为了提高缓冲区的利用率,目前广泛流行公用缓冲池,池中的缓冲区可供多个进程共享。缓冲池由空闲缓冲区、输入缓冲区(装满输入数据)、输出缓冲区(装满输出数据)组成。为了管理上的方便,可将相同类型的缓冲区链成一个队列,形成空缓冲队列emq、输入队列inq、输出队列outq三个队列,工作缓冲区包括收容输入缓冲区、提取输入缓冲区、收容输出缓冲区、提取输出缓冲区。
缓冲池使用具有Getbuf、Putbuf两个过程,为使各进程能互斥地和同步地访问缓冲池队列,可分别为每一队列设置一个互斥信号量MS(type)和资源信号量RS(type)。
Getbuf:
Putbuf:
缓冲区具有以下工作方式:
收容输入——输入进程需输入数据时,调用Getbuf(emq),从emq队首摘下一空缓冲区,作为收容输入缓冲区hin,把数据装入其中,再调用Putbuf(inq,hin),把hin挂在inq队列上。
提取输入——计算进程需输入数据时,调用Getbuf(inq),从inq队首摘下一缓冲区,作为提取输入缓冲区sin,从中提取数据,然后调用Putbuf(emq,sin),将该缓冲区挂在空缓冲队列emq上。
收容输出——计算进程需输出数据时,调用Getbuf(emq),从emq队首摘下一空缓冲区,作为收容输出缓冲区hout,把数据装入其中,再调用Putbuf(outq,hout),把hout挂在outq队列末尾。
提取输出——输出进程调用Getbuf(outq),从outq的队首摘取一装满数据的缓冲区,作为提取输出缓冲区sout,数据提取完后,再调用Putbuf(emq,sout),将该缓冲区挂在空缓冲区的末尾。
应用程序I/O接口
设备驱动程序隐藏了I/O控制器的差别,I/O系统调用把设备行为封装在通用类中,操作系统对不同的设备提供不同的接口(块设备——读、写、搜索,字符设备——输入、输出)。下图说明了内核中的I/O相关部分是如何按照软件层次来组织的。
I/O系统管理
I/O软件具有以下系统功能:
1)提供设备使用的用户接口——命令接口和编程接口。设备的符号标识
2)设备分配和释放——使用设备前需要分配设备和相应的通道、控制器。
3)设备的访问和控制——包括并发访问和差错处理。
4)I/O缓冲和调度——目标是提高I/O访问效率
I/O软件具有以下基本思想:
1)按分层思想构造软件
2)较低层软件要使较高层软件独立于硬件
3)较高层软件要向用户提供一个友好、规范、清晰的界面
I/O软件具有以下组织层次:
1)用户空间的I/O软件
2)设备独立软件(与设备无关的I/O软件)
3)设备驱动程序
4)中断处理程序
用户空间的I/O软件
大部分I/O软件都包含于操作系统的内核中,但一小部分I/O软件由与用户程序连接在一起的库函数构成,它们运行在操作系统的内核外。例如下列C语言程序调用了write库函数,并包含在运行时的二进制程序代码中count=write(fd, buffer, nbytes)。显然,write库函数是I/O系统的组成部分。
设备独立软件
完成与设备无关的I/O操作,具体包括向上层提供统一接口、分配和释放独占设备、实现设备独立性等。设备独立软件包括设备命名、设备保护、设备分配。
设备命名——负责把设备的符号名映射到相应的设备驱动程序。设备完成命名后,所有设备的名字集合即设备的名字空间。
设备保护——大多数计算机系统中,用户进程对I/O设备的访问被完全禁止。用户进程通过调用系统调用实现申请设备、使用设备和释放设备。
设备分配——多道程序环境下,系统中的设备不允许用户自行使用,必须由系统分配。为了实现设备分配,必须在系统中设置相应的数据结构。在进行设备分配时所需的数据结构包括设备控制表DCT(系统为每一个设备都配置了一张设备控制表,用于记录本设备的情况)、控制器控制表COCT(包含控制器标识符、控制器状态、与控制器连接的通道表指针、控制器队列的队首指针和队尾指针)、通道控制表CHCT(包含通道标识符、通道状态、与通道连接的控制器表指针、通道队列的队首指针和队尾指针)、系统设备表 SDT(整个系统有一张系统设备表)。
设备分配时应充分考虑设备固有属性(独占/共享)、分配算法(先来先服务/优先级高者优先)、分配安全性(安全分配方式指进程发出I/O请求后进入阻塞状态,直到I/O操作完成才被唤醒,否则为非安全分配方式)和设备独立性(应用程序独立于具体使用的物理设备,应用程序使用逻辑名称发起请求,系统将逻辑名称转换为具体物理设备进行相应)。
SPOOLing技术——用于将一台独占设备改造成共享设备,它在批处理操作系统时代引入,即所谓假脱机输入/输出技术。将这种技术用于对设备使用实质就是对I/O操作成批处理。具体而言,SPOOLing利用多道程序中的一道程序来模拟脱机输入时的外围控制机的功能,把低速I/O设备上的数据传送到高速磁盘上;用另一道程序来模拟脱机输出时的外围控制机的功能,把数据从磁盘传送到低速I/O设备上。这样便能在主机的直接控制下实现脱机I/O功能。此时,外围操作与CPU对数据的处理同时进行,这种在联机情况下实现的同时外围操作称为SPOOLing假脱机操作,它能提高I/O速度、将独占设备改造为共享设备并且实现虚拟设备功能。
例如SPOOLing技术可将一台打印机改造成一台可供多个用户共享的设备。当用户进程请求打印输出时,SPOOLing进行以下操作:
1)由输出进程在输出井中为之申请一块空闲盘块区,并将要打印的数据送入其中;
2)输出进程为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上
3)输出进程从请求打印队列中依次取出请求打印表,根据表中要求将要打印的数据从输出井传送到内存缓冲区,最后由打印机打印
设备驱动程序
设备驱动程序是I/O进程与设备控制器之间的通信程序,因为它常以进程的形式存在,故也可以称为设备驱动进程。不同的I/O设备具有很大的差异,之所以操作系统能够以统一的方式对待不同的I/O设备,是因为具体的差别被设备驱动程序内核模块所封装。设备驱动程序层的作用是为内核 I/O子系统隐藏设备控制器之间的差异。所有与具体设备相关的代码被放在设备驱动程序中,系统应为每一类设备配置至少一种驱动程序。一个特定设备可能带有多种设备驱动程序,例如MS-DOS、Win98、Win2000、Windows XP和Solaris驱动程序。
设备驱动程序的处理过程如下:
1)将接收的抽象要求转换为具体要求
2)检查用户I/O请求合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式
3)发出I/O命令,启动分配的I/O设备,完成指定I/O操作
4)及时响应由控制器或通道发来的中断请求,并根据中断类型调用相应中断处理程序
5)对于有通道的计算机系统,驱动程序还应能够根据用户I/O请求自动构建通道程序
中断处理程序
I/O子系统中时,设备控制器如果准备好服务会向CPU发出中断请求以表示输入数据已有或输出已完成或已检测到错误,CPU响应后便转而运行中断处理程序。无论哪种I/O设备,其中断处理程序的处理过程都包含以下步骤:
1)唤醒被阻塞的驱动程序进程
2)保护被中断进程的CPU环境
3)分析中断原因,运行相应的设备中断处理程序
4)进行中断处理
5)恢复被中断进程的现场