学习笔记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)函数用于释放一个缓冲区:
      • 如果缓冲区已修改(脏缓冲区),则将数据写回磁盘。
      • 将缓冲区标记为未使用,并将其放回空闲缓冲区列表。



新的I/O缓冲区管理算法

新的算法使用信号量上的P/V操作来实现缓冲区的唯一性、缓存效果、临界区的安全操作等要求。

算法设计要求:

  • 缓冲区唯一性
  • 无重试循环
  • 无不必要唤醒
  • 缓存效果
  • 无死锁和饥饿

优点:

  • 计数信号量提供了可表示资源数量的灵活性。
  • 释放资源时,V操作只会释放一个等待进程,无需重试。
  • 使用信号量上的P/V操作实现了对缓冲区的管理,更具可靠性。

缺点:

  • 无法完全消除竞态条件,但通过合理设计可以最小化其影响。
  • 这样的设计更适应多处理器系统,提高了可靠性和效率。

实践

posted @ 2023-11-19 19:57  20211312徐元琦  阅读(2)  评论(0编辑  收藏  举报