OS使用磁盘高速缓存来提高磁盘的I/O速度,对磁盘高速缓存的访问要比对磁盘数据的直接访问更为高效。
磁盘高速缓存技术不同于常规意义下的介于CPU和内存之间的小容量高速存储器,而是利用内存
中的存储空间暂存从磁盘中读出的一系列盘块中的信息,因此,磁盘高速缓冲物理上是驻留在内存中的盘块,逻辑上属于磁盘。
高速缓存在内存中分为两种形式,一种是在内存中开辟一个单独的空间作为磁盘高速缓存;另一种是把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O时共享。
引入缓冲区技术的目的:
但是硬件缓冲器成本太高,除了一些关键部位外,其他地方一般很少使用硬件缓冲器。
在内存中设置一个缓冲区,当设备和处理机需要交换数据时,先将数据写入缓冲区,然后需要数据的设备或处理机就从缓冲区取走数据。在一方写入或取出数据的过程中,另一方需要等待。
通常认为
工作区大小 ≈ 缓冲区大小
。
单缓冲区对每块数据的处理用时为max(C,T) + M
。
由于在数据传送时间M内,CPU处于空闲状态,因而CPU的利用率不高,因此引入双缓冲。I/O设备输入数据时先装填数据到缓冲区1,在缓冲区1装满后再去装填缓冲区2,与此同时处理机可以从缓冲区1取出数据送入工作区,当缓冲区1中的数据处理完之后,若缓冲区2的数据已经填满,则处理机又从缓冲器2取出数据进行处理,而此时I/O设备可能又把缓冲区1的数据填满了,然后如此反复。
双缓冲区对每块数据的处理用时为max(C + M,T)
。
若两台通信机器之间通信仅配置了单缓冲,则它们的通信方式类似于半双工,即统一时刻只能实现单方向的传输。
若两条通信机器之间通信配置了双缓冲,则可以实现全双工通信,即同一时刻双方可进行双向数据传输。
包含多个等大小的缓冲区,每个缓冲区中有个链接指针指向下一个缓冲区,最后一个缓冲区的链接指针指向第一个缓冲区,从而多个缓冲区构成一个环形的缓冲区链。
循环缓冲进行I/O时,还需要配备in和out两个指针。in指针指向第一个可用的空缓冲区,指示填充数据到缓冲区的起始缓冲区;out指针指向第一个填满的缓冲区,指示读取数据到工作区的起始缓冲区。
由许多公用的缓冲区组成,缓冲区按其使用情况可分为三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。缓冲区本身也分为四种:用于收容输入数据的工作缓冲区hin(host in)、用于提取输入数据的工作缓冲区sin、用于收容输入数据的工作缓冲区hout以及用户提取输出数据的工作缓冲区sout。
当输入进程要输入数据时,将从空缓冲队列的队首取得一个空缓冲区,并将其作为hin,然后填充数据到其中,最后将该缓冲区移入输入队列的队尾。
当计算进程需要输入数据时,将从输入队列的队首取得一个缓冲区,并将其作为sin,然后从中提取出数据来,随后将该缓冲区移入空缓冲队列的队尾。
当计算进程需要输出数据时,将从空缓冲队列的队首取得一个空缓冲区,并将其作为hout,然后填充数据到其中,最后将该缓冲区移入输出队列的队尾。
当输出进程需要输出数据时,将从输出队列的队首取得一个缓冲区,并将其作为sout,然后从中提取出数据来,随后将该缓冲区移入空缓冲队列的队尾。
为了使并发进程能有效的进行输入和输出,最好采用缓冲池结构的缓冲技术。
缓冲池通常建立在
内存
中。
设备分配是指根据用户的I/O请求分配所需的设备。分配的原则是充分发挥设备的使用效率,尽量避免因不合理分配造成的死锁。
进程分配到独占设备后,便由其独占使用,直至该设备使用完毕释放该设备。
可同时分配给多个进程,各进程通过分时共享的方式使用该设备。
SPOOLing技术实现了虚拟设备功能,可以将设备同时分配给多个进程使用。该技术实质上是对设备I/O操作的批处理。
用一个DCT来表征一个设备,该表中的各个表项就是设备的各个属性。
系统会为每个设备配置一张DCT。
设备控制器控制设备与内存交换数据,而设备控制器又要求通道为它服务,因此,每个COCT的表项中都存放一个指向CHCT的表项的指针。
而一个通道可以位多个设备控制器提供服务,因此每个CHCT的表项都有一个指向所提供服务的设备控制器组成的信息表的指针。
整个系统只有一张SDT,它记录已连接到系统中的所有设备的情况,每个设备占一个表项。
SDT中的每个表项含有指向DCT的指针。
设备分配应根据设备特性、用户要求和系统配置情况。既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开。
在多道程序中,进程数多于资源数,因此要有一套合理的分配原则,主要考虑的因素有I/O设备的固有属性、I/O设备分配的安全性以及I/O设备的独立性。
主要用于对独占设备的分配,它在用户作业开始执行前,就一次性的分配该作业所要求的全部设备、控制器。一旦资源被分配给该进程,这些设备、控制器将一直为该作业所有,直到该作业被撤销或完成。
该方式不会出现死锁问题,但设备使用效率低。
在进程执行过程中,若当前进程需要设备时,需要通过系统调用命令向系统提出设备请求,由系统按照某种策略安排给进程一个所需的设备、控制器,一旦该资源用完,进程将立即释放该资源。
该方式可能会因分配不当而出现死锁问题,但设备使用率高。
设备的分配方式主要有独享分配、共享分配和虚拟分配。
独占设备往往采用静态分配,共享设备往往采用动态分配。
指设备分配过程中应避免发生死锁。
每当进程发出I/O请求后便会进入阻塞态,直至I/O操作完成是才被唤醒。一旦进程获得某种设备后便阻塞,那么这个进程将不再请求任何资源,同时也不再保持任何资源。
其优点是设备分配安全,缺点是CPU与I/O设备是串行工作的。
进程发出I/O请求后仍继续运行,需要的时候又发出第二个、第三个I/O请求等,当且仅当进程所请求的设备被其他进程占用时,才进入阻塞态。
其优点是CPU可与多个I/O设备并行工作,缺点是可能会发生死锁。
在系统中设置一张逻辑设备表(Logical Unit Table,LUT)
,用于将逻辑设备名映射为物理设备名。
LUT中的表项包括逻辑设备名、物理设备名、设备驱动程序的入口地址。
当进程想借助逻辑设备名来请求分配设备时,系统将为它分配以太相对应的物理设备,并在LUT中新增一条对应的表项,当以后再次请求该逻辑设备时,系统将查找LUT来找到对应的无礼设备和设备驱动程序。
对于单用户系统,将在整个系统中只存放一张LUT,这样所有的设备分配情况将记录在同一张LUT中;对于多用户系统,将在每个用户中设备一张LUT。每当用户登录时,系统便为其创建一个进程,同时建立一张LUT,并存入进程的PCB中。
为了缓和CPU的高速性欲I/O设备的低速性之间的矛盾并且提高独占设备的资源利用率,引入了脱机输入/输出技术,它是OS中采用的一项将独占设备改造为共享设备的技术。
输入井
:是位于磁盘上的一个存储区域,用来模拟脱机输入时的磁盘以收容I/O设备输入的数据。输出井
:是位于磁盘上的一个存储区域,用来模拟脱机输出时的磁盘以收容用户程序输出的数据。输入缓冲区
:是位于内存上的一个缓冲区,用来暂存输入设备送来的数据,后续将被传送到输入井。输出缓冲区
:是位于内存上的一个缓冲区,用来暂存输出井送来的数据,后续将被传送到输出设备。输入进程/输出进程
:用于模拟脱机输入/输出时的外围控制机。用户要求的数据将从输入设备经过输入缓冲区进入输入井,当CPU需要输入数据时,将从输入井直接读入到内存。当CPU需要输出数据时,数据将经过输出缓冲区送到输出井,待输出设备空闲时,数据再从输出井井输出缓冲区送到输出设备。以共享式打印机为例:
SPOOLing技术只需要用到内存空间(输入/输出缓冲区)和外存空间(输入井/输出井),不需要外围计算机的支持。
SPOOLing 系统由预输入程序、井管理程序和缓输出程序组成。
在SPOOLing系统中,用户进程实际分到的是外存区,即虚拟设备。
构成SPOOLing系统的基本条件是要有大容量、高速度的硬盘作为输入井和输出井,还要有SPOOLing软件。
SPOOLing技术可将独占设备改为共多个用户共享的虚拟设备。
对于每种设备,OS都需要定义一组驱动程序必须支持的函数,驱动程序中通常包含一个表格,表格中具有针对这些抽象函数对应的驱动程序自身实现的指针。装载驱动程序后,OS记录这个函数指针表的表格地址,后续对于该设备调用一个抽象函数(如磁盘的读、写、格式化等)时,它可以根据这张表发出间接调用。(这个函数指针表定义了驱动程序与OS其余部分之间的接口,给定类型的所有设备必须遵守这一要求)
与设备无关的软件还负责将符号化的设备名映射到适当的驱动程序上。