Appearance
4.4 提高设备管理性能的相关技术
一、I/O缓冲
为了缓和CPU与I/O设备速度不匹配的矛盾,提高CPU和I/O设备的并行性,在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时,都用了缓冲区,缓冲管理的主要职责是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
核心思想:在内存中建立I/O缓冲区
缓存从输入设备流入内存的数据
缓存从内存流向输出设备的数据
在设备管理中,引入缓冲区的主要原因:
- 缓和CPU与I/O设备间速度不匹配的矛盾。
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
- 提高CPU和I/O设备之间的并行性。
两类I/O设备:
面向块
- 面向块的设备将信息保存在块中
- 块的大小通常是固定的
- 传送过程中一次传送一个块
面向流
- 面向流的设备以字节流的方式输入/输出数据
二、单缓冲和双缓冲
1. 单缓冲
在单缓冲情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区。
输入和计算是可以并行的,当T>C时,系统对每一块数据的处理时间为M+T;反之则为M+C,故可把系统对每一块数据的处理时间表示为Max(C,T)+M。
如图所示:T:输入时间,C:计算时间,M:数据传送时间
2. 双缓冲
在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时操作系统可以从第一缓冲区中移出数据,并送入用户进程。
在双缓冲时,如果假设缓冲区的数据传送到用户区时间M远小于输入时间T或计算时间C,系统处理一块数据的最大时间可粗略地认为max(C,T)。如果C<T,可使磁盘数据连续输入;如果C>T,可使CPU不必等待数据输入。
如果我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,如图(a)所示,那么,它们之间在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从A机传送到B机,或者从B机传送到A机,而绝不允许双方同时向对方发送数据。
为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区,如图(b)所示。
三、循环缓冲
当输入与输出两者的速度相差甚远,引入了多缓冲机制。可将多个缓冲组织成循环缓冲形式。
1. 循环缓冲的组成
多个缓冲区。每个缓冲区的大小相同。
多个指针。
- 指示计算进程下一个可用缓冲区G的指针Nextg。
- 指示输入进程下次可用的空缓冲区R的指针Nexti。
- 指示计算进程正在使用的缓冲区C的指针Current。
循环缓冲区的组织方式:
2. 循环缓冲区的使用
Getbuf
- 将Nextg指示的缓冲区提供给进程使用,Nextg置空,指针下移Nextg=(Nextg+1)Mod N。
- 将Nexti对应缓冲区提供给进程使用,Nexti置满,指针下移Nexti=(Nexti+1)Mod N。
Releasebuf
- 当输入进程装满缓冲区,调用Releasebuf释放的C缓冲,改为G缓冲。
- 当计算进程取空C缓冲,调用Releasebuf释放C缓冲,改为R。
3. 缓冲区管理的同步问题
使用输入循环缓冲,指针Nexti和指针Nextg将不断地沿着顺时针方向移动,这样就可能出现下述两种情况
Nexti指针追赶上Nextg指针。
- 这意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。此时,输入进程应阻塞。
Nextg指针追赶上Nexti指针。
- 这意味着输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数据。这时,计算进程只能阻塞。
四、缓冲池
为了提高缓冲区的利用率,目前广泛流行公用缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。
1. 缓冲池的组成
空缓冲队列emq。由空缓冲区所链成的队列。
输入队列inq。由装满输入数据的缓冲区所链成的队列。
输出队列outq,由装满输出数据的缓冲区所链成的队列。
还应具有四种工作缓冲区:
用于收容输入数据的工作缓冲区。
用于提取输入数据的工作缓冲区。
用于收容输出数据的工作缓冲区。
用于提取输出数据的工作缓冲区。
2. 缓冲区的工作方式
收容输入
提取输入
收容输出
提取输出