Alex_McAvoy

想要成为渔夫的猎手

I/O 系统缓冲区的管理

【概述】

现代 OS 中,几乎所有的 I/O 设备都在于处理机交换数据时用了缓冲区

缓冲是一个存储区域,其由专门的硬件寄存器组成,但由于硬件的成本较高,一般仅用在速度要求非常高的场合

在一般情况下,更多的是利用内存作为缓冲区

引入缓冲区的原因有很多,可归结于以下几点:

  • 缓和 CPU 与 I/O 设备间不匹配的矛盾
  • 减少 CPU 的中断频率,放宽 CPU 中断响应时间的限制
  • 解决数据粒度不匹配问题
  • 提高 CPU 与 I/O 设备间的并行性

随着设备速度差距越大,缓冲区容量也就越大,因此使用缓冲区的方式可归结为三类:

  • 单缓冲与多缓冲
  • 循环缓冲
  • 缓冲池

【单缓冲与多缓冲】

单缓冲

单缓冲的情况下,用户进程每发出一 I/O 请求时,OS 便在主存中为之分配一缓冲区

缓冲区由 CPU 和外设轮流使用,一方处理完后等待对方处理

字符设备输入时,缓冲区用于暂存用户输入/输出的一行数据;当块设备输入时,缓冲区用于暂存用户输入/输出的一块数据

多缓冲

由于缓冲是共享资源,为加快输入和输出速度,提高设备利用率,又引入了双缓冲机制,也称缓冲对换

在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区,此时 OS 可以从第一缓冲中移出数据,并送入用户进程,接着由 CPU 对数据进行计算

【循环缓冲区】

当输入输出速度基本匹配时,双缓冲能获得很好的效果,但当输入输出两者速度相差甚远时,双缓冲的效果则不够理想

为进一步协调速度差,可增加缓冲区数量,并将多个缓冲区组织成环形缓冲区的形式

循环缓冲区具有多个大小相同的缓冲区,分为三种类型:

  • 预备装输入数据的空缓冲区 R
  • 装满数据的缓冲区 G
  • 计算进程正在使用的现行工作缓冲区 C

【缓冲池】

目前广泛流行的是既可用于输入又可用于输出的公用缓冲池,池中设置了多个可供若干进程共享的缓冲区

缓冲池与缓冲区的主要区别在于:缓冲区仅是一组内存块的链表,缓冲池则是一种用于管理多个缓冲区的管理机制,其包含了一个管理的数据结构和一组操作函数

组成

缓冲池管理着多个缓冲区,为管理方便,一般将缓冲池吃中具有相同类型的缓冲区链成队列,因此可形成以下三个队列:

  • 空白缓冲队列 emq:由空缓冲区链成的队列
  • 输入队列 inq:由装满输入数据的缓冲区链成的队列
  • 输出队列 outq:由装满输出数据的缓冲区链成的队列

除上述三个队列外,还应具有以下四类工作缓冲区:用于收容数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收入输出数据的工作缓冲区、用于提取输出数据的工作缓冲区

缓冲池的工作方式

缓冲区在缓冲池中有如下四种工作方式:

  • 收容输入:用于完成收容输入数据的工作
  • 提取输入:用于完成提取输入数据的工作
  • 收容输出:用于完成收容输出数据的工作
  • 提出输出:用于完成提取输出数据的工作

感谢您对我的支持,让我继续努力分享有用的技术与知识点!