目录
1、缓冲区管理
缓冲区是一个存储区域,它可以由专门的硬件寄存器组成,也可以由内存组成。
由寄存器组成的缓冲区较小,成本较高,一般仅用在对速度要求非常高的场合,如存储器管理中所用的联想存储器,设备控制器中用的数据缓冲区等。更多情况下,都是使用内存作为缓冲区。
(1)单缓冲区和双缓冲区
如果在生产者与消费者之间未设置任何缓冲,生产者与消费者之间在时间上会相互限制。例如,生产者已经完成了数据的生产,但消费者尚未准备好接收,生产者无法把所生产的数据交付给消费者,此时生产者必须暂停等待,直到消费者就绪。如果在生产者与消费者之间设置了一个缓冲区,则生产者无需等待消费者就绪,便可把数据输出到缓冲区。//例如消息队列
1.1 - 单缓冲区
当用户进程发出 I/O请求时,操作系统便在主存中为之分配一个缓冲区。
由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。如果消费者尚未取走缓冲区中的数据,即使生产者又生产出新的数据,也无法将它送入缓冲区,生产者等待。
1.2 - 双缓冲区
为了加快输入和输出速度,提高设备利用率,又引入了双缓冲区机制,也称为缓冲对换(Buffer Swapping)。在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。//表面上看,无非就是多了一份缓冲区容量
双缓冲区在两台机器之间的通信应用
如果两台机器之间的通信仅使用单缓冲区,那么它们之间在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从 A 传送到 B 或者从 B 传送到 A,而绝不允许双方同时向对方发送数据。//半双工通信
为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区。
(2)环形缓冲区/多缓冲区
环形缓冲区由多个缓冲区的组成,其每个缓冲区的大小相同。其中的缓冲区可分为三种类型:空缓冲区 R、已装满数据的缓冲区 G 以及正在使用的缓冲区 C,如下图所示。//多缓冲区
因此,环形缓冲区也包含多个指针。如,用于指示下一个有数据的缓冲区 G 的指针 Nextg,指示下次可用的空缓冲区 R 的指针 Nexti,以及用于指示正在使用的缓冲区 C 的指针 Current。
// 对空间的循环使用,比如循环队列等
(3)缓冲池(Buffer Pool)
当系统较大时,会有许多的循环缓冲区,这不仅要消耗大量的内存空间,而且其利用率不高。为了提高缓冲区的利用率,可以使用既可用于输入又可用于输出的公用缓冲池,在池中设置了多个可供进程共享的缓冲区。//统一管理缓冲区
缓冲池与缓冲区的区别在于:缓冲区仅仅是一组内存块的链表