I/O缓冲

目录导航

一.概述

假设某个用户进程需要从磁盘中读入多个数据块,每次读一块,每块长度为512个字节。这些数据将被读入用户进程地址空间中的一个区域。最简单的方法是对磁盘单元执行一个I/O命令,并等待数据传输完毕。这个等待可以是忙等待,也可以是进程被中断挂起。

这种方法存在两个问题。首先,程序被挂起,等待相对比较慢的I/O完成。这种I/O方法干扰了操作系统的交换决策。如果使用了分页机制,那么至少需要将包含目标地址单元的页锁定在内存中。因此,尽管该进程的一部分页面可能被交换到磁盘,但不可能把该进程全部换出。其次,有可能出现单进程死锁。为了避免死锁,在发出I/O请求之前,参与I/O操作的用户存储空间必须立即锁定在内存中,即使这个I/O操作正在排队。

为了避免以上提到的这些开销和低效操作,或者也为了方便起见,在输入请求发出前就开始执行输入传送,并且在输出请求发出一段时间后才开始执行输出传送,这项技术就成为I/O缓冲。

二.分类

1.单缓冲

操作系统中提供的最简单的类型是单缓冲。当用户进程发出I/O请求时,操作系统给该操作分配一个位于内存中系统部分的缓冲区。

输入传送的数据被放到系统缓冲区中。当传送完成时,进程把该块移到用户空间,并立即请求另一块,这称为预读,这样做通常是合理的,因为数据通常是被顺序访问的,只有在处理序列的最后才会读入一个不必要的块。相对于无系统缓冲的情况,这种方法通常会提高系统速度。用户进程可以在下一数据块读取的同时,处理已读入的数据块。由于输入发生在系统内存中而不是用户进程内存,因此操作系统可以将该进程换出。但是这种技术增加了操作系统的逻辑复杂度,操作系统必须记录给用户进程分配系统缓冲区的情况,而且交换逻辑也受到影响:如果I/O操作所涉及的磁盘和用户交换的磁盘是同一个磁盘,则磁盘写操作排队等待进程换出到同一个设备上是没有任何意义的。若试图换出进程并释放内存,则要在I/O操作完成后才能开始,而在这个时候,把进程换出到磁盘已经不再合适了。

2.双缓冲

作为对单缓冲方案的改进,可以给操作分配两个系统缓冲区。在一个进程往一个缓冲区中传送数据的同时,操作系统正在清空另一个缓冲区,这种技术称作双缓冲。

3.循环缓冲

双缓冲方案可以平滑I/O设备和进程之间的数据流。如果关注的焦点是某个特定进程的性能,那么需要相关I/O操作能够跟得上这个进程,如果该进程需要爆发式地执行大量的I/O操作,仅有双缓冲就不够了,在这种情况下,通常使用多于两个缓冲区的方案来缓解不足,因此,整个这组缓冲区就被当成循环缓冲区,其中每一个缓冲区是这个循环缓冲区的一个单元。

三.缓冲的作用

缓冲是用来平滑I/O需求峰值的一种技术,但是当进程的平均需求大于I/O设备的服务能力时,缓冲再多也不能让I/O设备与这个进程一直并驾齐驱。即使有多个缓冲区,所有缓冲区终将会被填满,进程在处理完每一大块数据后不得不等待。但是,在多道程序设计环境中,当存在多种I/O活动和多种进程活动时,缓冲是提高操作系统效率和单个进程性能的一种方法。

[1]

相关百科
返回顶部
产品求购 求购