1.高速缓存与缓冲区
1.磁盘高速缓存
操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对访问高速缓存要比访问原始磁盘数据更为高效。磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
高速缓存在内存中分为两种形式,一种是在内存中开辟一个单独的空间作为磁盘高速缓存,大小固定;另一种是把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘 I/O时共享。
2.缓冲区(Buffer)
在设备管理子系统中,引入缓冲区的目的主要如下:
1)缓和CPU与I/O设备间速度不匹配的矛盾。
2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
3)解决基本数据单元大小(即数据粒度)不匹配的问题。
4)提高 CPU和I/O 设备之间的并行性。
其实现方法如下:
1采用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不采用硬件缓冲器。
2)采用缓冲区(位于内存区域)。
根据系统设置缓冲器的个数,缓冲技术可以分为如下几种:
(1)单缓冲
在主存中设置一个缓冲区。当设备和处理机交换数据时,先将数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据,在缓冲区写入或取出的过程中,另一方需等待。
在研究每块数据的处理时间时,有一个技巧:假设一种初始状态,然后计算下一次到达相同状态时所需要的时间,就是处理一块数据所需要的时间。在单缓冲中,这种初始状态为:工作区是满的,缓冲区是空的。
(2) 双缓冲
I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理机可以从缓冲区中取出数据送入用户进程,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理机又从缓冲区2中取出数据送入用户进程,而I/O 设备又可以装填缓冲区1。注意,必须等缓冲区2充满才能让处理机从缓冲区2取出数据。双缓冲机制提高了处理机和输入设备的并行程度 。
为了研究双缓冲处理一块数据的用时,我们先规定一种初始状态:工作区是空的,其中一个缓冲区是满的,另外一个缓冲区是空的 。
(3)循环缓冲
包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。
循环缓冲用于输入/输出时,还需要有两个指针 in和out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区,当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据,out 指针指向可以提取数据的第一个满缓冲区。输出则正好相反。
(4) 缓冲池
由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列: 空缓冲队列、装满输入数据的缓冲队列(输入队列) 和装满输出数据的缓冲队列(输出队列)。还应具有 4 种缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收容输出数据的工作缓冲区及用于提取输出数据的工作缓冲区。
3.高速缓存与缓冲区的对比
相同点:都介于高速设备和低速设备之间
区别:
1)高速缓存放的是低速设备上的某些数据的复制数据,即高速缓存上有的,低速设备上面必然有;缓冲区存放的是低速设备传递给高速设备的数据(或相反),而这些数据在低速设备(或高速设备)上却不一定有备份,这些数据再从缓冲区传送到高速设备(或低速设备)。
2) 高速缓存存放的是高速设备经常要访问的数据,若高速设备要访问的数据不在高速缓存中,则高速设备就需要访问低速设备;高速设备和低速设备的通信都要经过缓冲区,高速设备永远不会直接去访问低速设备。
2.设备分配与回收
1.设备分配概述
设备分配是指根据用户的I/O 请求分配所需的设备。分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。从设备的特性来看采用下述三种使用方式的设备分别称为独占设备、共享设备和虚拟设备。
1)独占式使用设备。进程分配到独占设备后,便由其独占,直至该进程释放该设备。
2)分时式共享使用设备。对于共享设备,可同时分配给多个进程,通过分时共享使用。
3)以SPOOLing 方式使用外部设备。SPOOLing 技术实现了虚拟设备功能,可以将设备同时分配给多个进程。这种技术实质上就是实现了对设备的I/O操作的批处理。
2.设备分配的数据结构
设备分配依据的主要数据结构有设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表 (SDT)。
3.设备分配的策略
1)设备分配原则。设备分配应根据设备特性、用户要求和系统配置情况。既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开。
2)设备分配方式。设备分配方式有静态分配和动态分配两种。
静态分配主要用于对独占设备的分配,它在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备控制器。一旦分配,这些设备、控制器就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低。@动态分配在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按某种策略给进程分配所需要的设备、控制器,一旦用完,便立即释放。这种方式有利于提高设备利用率,但若分配算法使用不当,则有可能造成进程死锁。
3)设备分配算法。常用的动态设备分配算法有先请求先分配、优先级高者优先等。
对于独占设备,既可以采用动态分配方式,又可以采用静态分配方式,但往往采用静态分配方式。共享设备可被多个进程所共享,一般采用动态分配方式,但在每个 I/O 传输的单位时间内只被一个进程所占有,通常采用先请求先分配和优先级高者优先的分配算法。
4.设备分配的安全性
设备分配的安全性是指设备分配中应防止发生进程死锁。
1)安全分配方式。每当进程发出 I/O 请求后便进入阻塞态,直到其 I/O 操作完成时才被唤醒。这样,一旦进程已经获得某种设备后便阻塞,不能再请求任何资源,而在它阻塞时也不保持任何资源。其优点是设备分配安全,缺点是 CPU和I/O 设备是串行工作的。
2)不安全分配方式。进程在发出I/O请求后仍继续运行,需要时又发出第二个、第三个I/O请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞态。优点是一个进程可同时操作多不设备,使进程推进迅速;缺点是有可能造成死锁。
5.逻辑设备名到物理设备名的映射
为了提高设备分配的灵活性和设备的利用率,方便实现I/O 重定向,引入了设备独立性。设备独立性是指应用程序独立于具体使用的物理设备。
为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备,在系统中设置一张逻辑设备表(LUT),用于将逻辑设备名映射为物理设备名。LUT 表项包括逻辑设备名、物理设备名和设备驱动程序入口地址,当进程用逻辑设备名来请求分配设备时,系统为它分配一台相应的物理设备,并在LUT 中建立一个表目,当以后进程再利用该逻辑设备名请求I/O操作时,系统通过查找 LUT来寻找对应的物理设备和驱动程序。
在系统中可采取两种方式设置逻辑设备表:
1)在整个系统中只设置一张LUT。这样,所有进程的设备分配情况都记录在同一张LUT中因此不允许 LUT 中具有相同的逻辑设备名,主要适用于单用户系统。
2)为每个用户设置一张 LUT。每当用户登录时,系统便为该用户建立一个进程,同时也头之建立一张LUT,并将该表放入进程的PCB中。
3.SPOOLing 技术(假脱机技术)
为了缓和 CPU 的高速性与 I/0 设备低速性之间的矛盾,引入了脱机输入/输出技术,它是操作系统中采用的一项将独占设备改造成共享设备的技术。该技术利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上,或者相反。
(1)输入井和输出井
在磁盘上开辟出的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。一个进程的输入(或输出)数据保存为一个文件,所有进程的数据输入(或输出)文件链接成一个输入(或输出)队列。
(2)输入缓冲区和输出缓冲区
在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
(3)输入进程和输出进程
输入/输出进程用于模拟脱机输入/输出时的外围控制机。用户要求的数据从输入设备经过输入缓冲区送到输入井,当CPU需要输入数据时,直接从输入井读入内存。用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备。
共享打印机是使用SPOOLing 技术的实例。系统并非立即执行真实的打印操作,而只是立即将数据输出到缓冲区,真正的打印操作是在打印机空闲且该打印任务已排在等待队列队首时进行的。
SPOOLing 系统的特点如下:①提高了 I/O的速度,将对低速I/O 设备执行的I/O操作演变为对磁盘缓冲区中数据的存取,如同脱机输入/输出一样,缓和了 CPU 和低速 I/O 设备之间的速度不匹配的矛盾,②将独占设备改造为共享设备,在假脱机打印机系统中,实际上并没有为任何进程分配设备;③实现了虚拟设备功能,对每个进程而言,它们都认为自己独占了一个设备。
SPOOLing 技术是一种以空间换时间的技术。
1)当处理机和外部设备的速度差距较大时,有什么办法可以解决问题?
可采用缓冲技术来缓解 CPU 与外设速度上的矛盾,即在某个地方(一般为主存)设立一片缓冲区,外设与CPU的输入/输出都经过缓冲区,这样外设和CPU就都不用互相等待。
2)什么是设备的独立性?引入设备的独立性有什么好处?
设备独立性是指用户在编程序时使用的设备与实际设备无关。一个程序应独立于分配给它的某类设备的具体设备,即在用户程序中只指明I/O使用的设备类型即可。
设备独立性有以下优点: ①方便用户编程。② 使程序运行不受具体机器环境的限制。③便于程序移植。