第三章 数据缓冲区高速缓存-Unix操作系统设计-读书笔记

本文详细探讨了Unix操作系统中数据缓冲区高速缓存的设计,包括缓冲首部buffer_head、缓冲池结构、缓冲区检索getblk算法及其五种情况,以及读写磁盘块的操作。缓冲高速缓存通过减少磁盘存取频率,提高系统响应时间和吞吐量。文章还分析了高速缓冲的优缺点,并讨论了延迟写操作、中断处理和缓冲区清理算法。
摘要由CSDN通过智能技术生成

文章目录

第三章 数据缓冲区高速缓存

对文件系统的一切存取操作,核心都能通过每次直接从磁盘上读或往磁盘上写来实现。但是慢的磁盘传输速率会使系统响应时间加长、吞吐率降低;因此,核心通过保持一个称为数据缓冲区高速缓冲的内部缓冲区池来试图减小对磁盘的存取频率,高速缓冲含有最近被使用过的磁盘块的数据。

高层核心算法让高速缓冲模块把数据预先缓存起来,或延迟写数据以扩大高速缓冲的效果!

缓冲首部—buffer_head

好吧,Linux中的buffer.c就是完全盗版的这本书里的数据结构和算法···,没话说,不过Linux还是有非常多的过人之处的;
[外链图片转存失败(img-k4jBcOFg-1567059782827)(en-resource://database/3190:1)]
Linus将上图中的状态分成了三个分量:lock, uptodate, dirt

缓冲池的结构

核心遵循的算法的是:最近最少使用算法,即在空闲表中选取缓冲区时要选择最近最少使用的缓冲区; 即空闲表会维护一个最近最少使用的次序,空闲表的开头一般是最近最少使用的缓冲块;

当核心把一个缓冲区还给缓冲区池时,它通常把该缓冲区附到空闲表的尾部;

另外一点就是散列表和散列函数:
[外链图片转存失败(img-hoAHLmB5-1567059782827)(en-resource://database/3192:1)]
散列表中对应的队列也是双向链表

散列队列中各个缓冲区的位置是不重要的,没有两个缓冲区可以同时包含一个磁盘块上的内容,因此,缓冲区池中的每个磁盘块存在且仅存在于一个散列队列中,并且仅在那个散列队列中呆一阵;然而,如果一个缓冲区为空闲状态,则它也可以在空闲表中;因为一个缓冲区既可在一个散列队列中又可在一个空闲队列中,所以核心有两个办法可以找到它;如果要找一个特定缓冲区,则从散列表中找,如果要找空闲缓冲区,则遍历空闲表;

一个缓冲区总是在某个散列队列上,但是它可以在或不在空闲表中;??? 那么初始状态呢?

说起来,如果不读本书,那么Linux代码可能很难理解透彻;

缓冲区的检索-getblk

getblk:将一个缓冲区分配给磁盘块,下面讨论五种情况:

1 该块在散列队列中,并且它的缓冲区是空闲的

 将该缓冲区标记为忙,并将该缓冲块从空闲链表中摘下来;
 用完之后会调用brelse,其会将该块放置到空闲表尾部,但是并没有把散列表中的指针破坏,也就是说如果再次调用了相同的getblk仍然可以找到该缓冲区,但是如果其他缓冲区不够用了,也可以将刚才释放的缓冲区拿去用;

2 散列队列中找不到,从空闲表中分配一个

 注意从空闲表中找到的这个缓冲区也可能会在某个散列队列中,因为其曾经分配给另一个磁盘块;
 这时候会将其链接到对应的散列队列中,也会改变其在空闲表中的结构,将其从空闲表中摘下来;

3 散列队列中找不到,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值