I/O设备是人们使用计算机的途径,无意相当于计算机的五官,不同的使用方式需要配备不同的设备,如输入文字一般用键盘,但在某些应用场合,需要扫描仪,输入声音需要话筒,打印信息需要打印机,实时控制RT领域需要传感器。
摘自《操作系统原理及应用》一书关于IO设备从不同角度的分类
使用目的
1.存储设备:alias外存、辅助存储器
2.输入/输出设备
按传输速率分类
1.低速设备:几~几百Bytes/sec,典型如键盘、鼠标、低速打印机
2.中速设备:几K~几W Bytes/sec,典型如激光打印机
3.高速设备:>几十W Bytes/sec,典型如磁带机、磁盘驱动器、光盘驱动
按信息传输单位分类
1.块设备:以数据块为单位进行传输操作,如磁盘驱动器,以盘块为单位进行传输
2.字符设备:传输数据以字节为单位的设备,如打印机、显示器、键盘
按资源分配方式分类
1.独占设备:当有多个进程共享某一设备时,只允许一个进程访问的设备称为独占设备。如打印机。
2.共享设备:典型的如磁盘机。
3.虚拟设备:针对独占设备使用效率低下,可通过虚拟技术将一台独占设备变换为若干台逻辑设备,每个进程使用一台逻辑设备。如在多个并发进程共享一台打印机,可以为每个进程分配一个打印缓冲区,在打印时不直接输出到打印机,而是先输出到打印缓冲区,然后在OS管理下,在适当时机在真正打印机上打印。
1. IO设备管理的抽象层
在分时并行多任务系统中,为了合理利用系统设备,达到一定的目标,不允许进程自行决定设备的使用,而是由系统按一定原则统一分配、管理。进程要进行IO操作时,需向操作系统提出IO请求,然后由操作系统根据系统当前的设备使用状况,按照一定的策略,决定对改进程的设备分配。设备的应用领域不同,其物理特性各异,但某些设备之间具有共性,为了简化对设备的管理,可对设备分类,或对同类设备采用相同的管理策略,比如Linux主要将外部IO设备分为字符设备和块设备(又被称为主设备),而同类设备又可能同时存在多个,故而要定位具体设备还需提供“次设备号”。
根据主设备号+次设备号可以去相应的设备开关表中定位具体的设备驱动程序。 内核和设备驱动程序的接口是块设备开关表和字符设备开关表。每一种设备类型在表中占用一个表项,每个表项含有若干数据项,其中有一项为该类设备驱动程序入口地址,在系统调用时引导核心转向适当的驱动程序接口。
Linux系统为各类设备分别配置不同的驱动程序,在用户程序中通过文件操作方式使用设备,如open\close\read\write等,由文件系统根据用户程序指令转向调用具体的设备驱动程序。
对设备特殊文件的系统调用,根据文件类型转入块设备开关表或字符设备开关表进行打开、关闭设备的操作,字符设备特殊文件的系统调用read、write转向字符设备开关表中指示的设备驱动程序,而对普通文件或目录文件的read\write系统调用则通过高速缓冲模块(缓冲区)转向设备驱动模块中的strategy过程。Linux中关于不同设备种类的管理架构如下:
2. 设备分配使用方式
独占设备是指被分配给一个进程后,就被该进程独占使用,必须等到该进程退出后,其他进程才能进入,(如打印机)。
共享设备是指可以由多个进程交替使用的设备,如磁盘。
对于独占设备通常采用静态分配的方式,在一个作业开始执行前进程独占设备的分配,一旦把某独占设备分配给作业,就被该作业独占(永久地分配给该作业),直到作业结束撤离时,才由操作系统将分配给作业的独占设备收回,静态分配方式实现简单,但是设备利用效率不高。
对于共享设备采用动态分配方式,即在作业运行过程中,当进程需要使用设备时,通过系统调用命令向系统提出IO请求,系统按一定策略为进程分配所需设备,进程一旦使用完毕就立即释放该设备。共享设备一旦完成当前IO工作就被释放,从而使多个并发进程可以交替使用此设备,设备利用率高。
自然而然的设备分配算法有两种常见的:1.先来先服务FIFO队列;2.优先级队列(多个不同级别的FIFO队列)。
而一旦涉及到共享对象的分配,则显然需要考虑死锁的情况,多个进程彼此占有对方此刻正在请求的资源,形成“请求并且保持”的僵局。
1.独占设备不存在死锁问题
对于独占设备的分配不需要考虑死锁,因为作业的独占设备分配是在作业开始前执行,若当前作业不能分配到所需的独占资源,则作业不能运行,也就不需要分配其他所需设备,不形成“占有并继续请求”的僵局。
2.共享设备需要考虑死锁问题
对于共享设备的分配则需要考虑“死锁”的情况:死锁的出现是因为作业可同时操作多个设备。显然出于对死锁的问题应对,共享设备的分配分为安全和不安全两种调度方式:
a.安全分配方式:此种分配模式下,当进程通过系统调用发出IO请求,进程立即进入阻塞状态,直到所提出的IO请求完成才被唤醒。因为进程阻塞时不会继续请求其他设备,进程继续运行时已经释放曾经占有的并已经完成IO操作的共享设备,所以一个进程在任何时刻都不可能在占有一个共享设备的同时提出对其他共享设备的请求,因此不符合死锁的必要条件—“占有并继续请求”。这种分配方式虽然安全,但是使得进程进展速度较慢。
2.不安全分配方式:此分配方式下,进程发出IO请求后继续运行,在运行过程中可以发出第二个IO请求、第三IO请求……,仅当进程所请求的设备已经被另一进程占用时,请求进程才可以进入阻塞状态。这种分配方式使一个进程可以同时操作多个设备,使进程进展迅速。但是可能具备“占有并继续请求”的条件,故而可能会发生死锁。
3. 设备无关性
设备无关性是指当在应用程序中使用某类设备时,不直接指定具体使用哪个设备,而只指定使用哪类设备,由操作系统为进程分配具体的一个该类设备。设备无关性功能可以使应用程序的运行不依赖于特定设备是否完好、是否空闲,而由系统合理地进行分配,从而保证程序的顺利进行。
为了便于描述设备无关性,引入逻辑设备和物理设备这两个概念。逻辑设备指示一类设备,物理设备指示一台具体的设备。类似于虚拟内存和物理内存的对应关系。这要求存储管理要具备地址变换的功能。
设备无关性显然也是操作系统关于IO设备管理提供的一层抽象层,让上层程序无需关心使用IO设备的细节情况。
4. 虚拟设备技术:利用增加抽象层再一次完美解决独占设备影响进程速度的问题
系统中独占设备的数量有限,且对独占设备的分配往往采用静态分配方式,这样做不利于提高系统效率,这些设备只能分配给一个作业,且 在作业的整个运行期间一直被占用,直至作业结束后才能被释放。但是一个作业往往不能充分利用该设备,在独占设备被某个作业占用期间,往往只有一部分时间在工作,其余时间出于不工作的空闲状态,因此设备利用率低,其他申请该设备的作业因得不到该设备而无法工作,降低了系统效率。
另一方面,独占设备往往是低速设备,因此,在作业执行过程中,如果直接使用该类设备会因为数据传输的低速大大延长作业的执行时间。
为了克服独占设备的这些缺点,可以采用虚拟设备技术,即用为每个独占设备配备相应的高速缓冲区(如高速磁盘、内存中专门划分的存储区域)来模拟该独占设备同时并存的多个虚拟接口。
虚拟设备技术的关键是预读取、缓写入
预读取:在作业执行前,操作系统便将作业信息从独占设备预先读取到高速外存中,此后作业执行中不再占有独占输入设备,使用数据时不必再从独占设备输入,而是从高速外存中读取;
缓写入:在作业执行过程中,当要进行输出操作时,不必直接启动独占设备输出数据,可以先将作业输出数据先写入到高速缓冲区中,并设置延迟写的标志,可以在作业执行完毕或延迟写时间到达后,再由操作系统来组织信息的批量输出。
由于作业运行期间不占有独占设备,从而使一台独占设备可以利用虚拟设备技术制造出多个影分身,提高了独占设备的利用率,而且在作业执行过程中,作业并不直接和慢速的独占设备打交道,因此缩短了作业的执行时间。