• 《Unix/Linux系统编程》第十二章学习笔记


    学习笔记

    20191318 王泽文

      《Unix/Linux系统编程》


    第十二章 块设备I/O和缓冲区管理

      本章讨论了块设备 I/O 和缓冲区管理;解释了块设备 I/O 的原理和 I/O 缓冲的优点;论述了 Unix 的缓冲区管理算法。


      块设备I/O缓冲区

      I/O 缓冲的基本原理非常简单。文件系统使用一系列 I/O 缓冲区作为块设备的缓存内存。当进程试图读取 (dev, blk) 标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。如果该缓冲区存在并且包含有效数据,那么它只需从缓冲区中读取数据,而无须再次从磁盘中读取数据块。如果该绥冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读入缓冲区,然后从缓冲区读取数据。当某个块被读入时,该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。同样,当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入绥冲区,将缓冲区标记为脏,以延迟写入,并将其释放到缓冲区缓存中。由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写请求,而不会引起实际磁盘I/O。脏缓冲区只有在被重新分配到不同的块时才会写入磁盘。

      Unix I/O缓冲区管理算法

    1. I/O 缓冲区:内核中的一系列NBUF缓冲区用作缓冲区缓存。每个缓冲区用一个结构体表示。缓冲区结构体由两部分组成; 用于缓冲区管理的缓冲头部分和用于数据块的数据部分。为了保护内核内存, 状态字段可以定义为一个位向扭, 其中每个位表示一个唯一的状态条件。
    2. 设备表:每个块设备用一个设备表结构表示。
    3. 缓冲区初始化: 当系统启动时 , 所有I/O缓冲区都在空闲列表中, 所有设备列表和I/O队列均为空。
    4. 缓冲区列表: 当缓冲区分配给 (dev, blk) 时, 它会被插人设备表的dev_list 中。 如果缓冲区当前正在使用, 则会将其标记为BUSY (繁忙)并从空闲列表中删除。繁忙缓冲区也可能会在设备表的 I/O 队列中。 由于一个缓冲区不能同时处于空闲状态和繁忙状态, 所以可通过使用相同的 next_free 指针来维护设备 I/O 队列。 当缓冲区不再繁忙时, 它会被释放回空闲列表, 但仍保留在 dev_list 中, 以便可能重用。 只有在重新分配时, 缓冲区才可能从一个 dev_list 更改到另一个 dev_list 中。 如前文所述, 读/写磁盘块可以表示为 bread 、 bwrite 和dwrite, 它们都要依赖于 getblk 和 brelse。 因此, getblk 和 brelse 构成了 Unix 缓冲区管理方案的核心。

      Unix算法的一些具体说明

    1. 数据一致性:为了确保数据-致性,getblk一定不能给同一个(dev,blk)分配多个缓冲区。这可以通过让进程从休眠状态唤醒后再次执行“重试循环”来实现。读者可以验证分配的每个缓冲区都是唯一的。其次,脏缓冲区在重新分配之前被写出来,这保证了数据的一致性。
    2. 缓存效果:缓存效果可通过以下方法实现。释放的缓冲区保留在设备列表中,以便可能重用。标记为延迟写入的缓冲区不会立即产生I/O、并且可以重用。缓冲区会被释放到空闲列表的末尾,但分配是从空闲列表的前面开始的。这是基于LRU(最近最少使用)原则, 它有助于延长所分配缓冲区的使用期,从而提高它们的缓存效果。
    3. 临界区:设备中断处理程序可操作缓冲区列表,例如从设备表的I/O队列中删除 bp. 更改其状态并调用brelse(bp)。所以,在getblk和brelse中,设备中断在这些临界区中会被屏蔽。这些都是隐含的,但没有在算法中表现出来。

      Unix算法的缺点

      虽然Unix算法非常简单和简洁.但它也有以下缺点。

    1. 效率低下:该算法依赖于重试循环。例如,释放缓冲区可能会唤醒两组进程:需要释放的缓冲区的进程,以及只需要空闲缓冲区的进程。由于只有一个进程可以获取释放的缓冲区,所以,其他所有被唤醒的进程必须重新进入休眠状态。从休眠状态唤醒后,每个被唤醒的进程必须从头开始重新执行算法,因为所需的缓冲区可能已经存在。这会导致过多的进程切换。
    2. 缓存效果不可预知:在Unix算法中,每个释放的缓冲区都可被获取。如果缓冲区由需要空闲绥冲区的进程获取,那么将会重新分配缓冲区.即使有些进程仍然需要当前的缓冲区。
    3. 可能会出现饥饿:Unix算法基于“自由经济”原则,即每个进程都有尝试的机会,但不能保证成功。因此,可能会出现进程饥饿。
    4. 该算法使用只适用于单处理器系统的休眠/唤醒操作。

  • 相关阅读:
    性能测试入门
    PHP基础
    SpringCloud五大核心组件
    selenium(八)持续集成
    四种隔离级别和脏读、幻读、不可重复读
    RocketMQ【目录】
    ModelAgnostic Counterfactual Reasoning for Eliminating Popularity Bias in Recommender System
    How Powerful is Graph Convolution for Recommendation?
    ScoreBased Generative Modeling through Stochastic Differential Equations
    Graph Embedding for Recommendation against Attribute Inference Attacks
  • 原文地址:https://www.cnblogs.com/wzwyoshino/p/15583915.html
Copyright © 2020-2023  润新知