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