学习笔记10
第12章 块设备I/O和缓冲区管理
块设备和I/O缓冲区
由于磁盘I/O速度相对较慢,文件系统通常使用I/O缓冲来减少存储设备的物理I/O数量,提高文件I/O效率,增加系统吞吐量。基本原理是使用一系列I/O缓冲区作为块设备的缓存内存,以避免每次执行读写文件操作时都进行磁盘I/O。
I/O缓冲区的基本原理
- 读取操作: 当进程尝试读取磁盘块(dev,blk)时,系统首先搜索缓冲区缓存中是否已分配给该磁盘块的缓冲区。如果存在且包含有效数据,则直接从缓冲区中读取,而无需再次从磁盘读取。
- 缓冲区分配: 如果缓冲区不存在,系统为磁盘块分配一个缓冲区,将数据从磁盘读入缓冲区,并将其保存在缓冲区缓存中。这样,下次任何进程对相同块的读/写请求都可以使用缓冲区中的数据,而无需进行实际磁盘I/O。
- 写入操作: 当进程写入磁盘块时,系统首先获取一个分配给该块的缓冲区,将数据写入缓冲区,将缓冲区标记为脏(表示数据已被修改),然后释放到缓冲区缓存中。脏缓冲区只有在被重新分配到不同的块时才会写入磁盘。
Unix缓冲区管理子系统
- 设备表:用于存储设备的缓冲区列表和I/O队列。
- Unix getblk/brelse算法:用于分配和释放缓冲区。
- getblk(dev, blk)函数用于获取一个缓冲区:
- 首先搜索设备的缓冲区列表,找到匹配的缓冲区。
- 如果缓冲区已分配且正在使用,则设置等待标志,并让进程睡眠,直到有空闲缓冲区。
- 如果缓冲区未分配,则从空闲缓冲区列表中取出,标记为正在使用,并返回该缓冲区。
- brelse(bp)函数用于释放一个缓冲区:
- 如果缓冲区已修改(脏缓冲区),则将数据写回磁盘。
- 将缓冲区标记为未使用,并将其放回空闲缓冲区列表。
- getblk(dev, blk)函数用于获取一个缓冲区:
新的I/O缓冲区管理算法
新的算法使用信号量上的P/V操作来实现缓冲区的唯一性、缓存效果、临界区的安全操作等要求。
算法设计要求:
- 缓冲区唯一性
- 无重试循环
- 无不必要唤醒
- 缓存效果
- 无死锁和饥饿
优点:
- 计数信号量提供了可表示资源数量的灵活性。
- 释放资源时,V操作只会释放一个等待进程,无需重试。
- 使用信号量上的P/V操作实现了对缓冲区的管理,更具可靠性。
缺点:
- 无法完全消除竞态条件,但通过合理设计可以最小化其影响。
- 这样的设计更适应多处理器系统,提高了可靠性和效率。