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)返回缓冲块头指针

原文地址:https://www.cnblogs.com/windmissing/p/2559837.html