• Linux0.12文件系统高速缓冲区的管理


    1.高速缓冲区

    位置:内核代码和主内存之间

    作用:解决I/O操作与CPU处理之间的速度不匹配

    大小:被划分成与磁盘数据块大小相等的缓冲块

    管理方式:hash表(设备号^逻辑块号) + 双向链表(所有的buffer_head)


    2.高速缓冲的划分:



    3.管理方式:注意,并不是一个散列队列组成双向链表,而是所有的缓冲块,顺序是最近最少使用(LRU)


    4.bread() ----- 从设备上读取数据块

    (1)获取缓冲区getblk()

    (2)判断缓冲区数据是否有效,

    若有效,则返回缓冲区指针。(有效:数据已从设备读入到缓冲区,因为程序是异步执行的)

    (3)向块设备驱动程序申请,同时让进程进入睡眠ll_rw_block()(详见驱动设备)

    (4)睡眠中,直到块设备驱动程序把指定的数据放入高速缓冲区后

    (5)判断缓冲区数据是否有效

    若有效,则返回缓冲区指针

    若无效,则释放缓冲区,返回空指针


    5.getblk() ----- 获取空闲缓冲块

    (1)搜索hash表,判断指针设备号和逻辑块号的缓冲区是 否存在(见管理方式)

    若存在:go to step 12(已经得到了所需要的缓冲块)

    (2)搜索空闲队列

    若未找到空闲块,go to step 1

    (3)等待空闲块解锁

    (4)若空闲块又被占用,go to step 1

    (5)若该块已被修改过,则

    将数据写入设备

    进入睡眠等待数据写完

    (6)若块又被占用,go to step 1

    (7)若该块被加入高速缓冲区,go to step 1(被别的设备抢先占用)

    (8)(走到这里说明已经可以占有这个缓冲块了)修改缓冲块标志

    (9)从hash表和双向表中移出

    (10)占用该块,修改块号和设备号

    (11)根据(10)重新插入hash表,插入双向表的末尾(LRU)

    (12)返回缓冲块头指针

  • 相关阅读:
    deb 和 rpm 后缀文件 区别和安装
    20.pipe
    19.Observales
    18.4 运行脚本 sudo ./launcher.sh 必须先给他权限 才能使用
    18.3 redis 的安装
    18.2 不同用户 不同颜色光标 redis
    18.1利用socket .io 实现 editor间代码的同步
    18. socket io
    java 设计模式
    Gson 2.8.jar基础
  • 原文地址:https://www.cnblogs.com/windmissing/p/2559837.html
Copyright © 2020-2023  润新知