揭秘UNIX文件缓存(the buffer cache)(理论篇)

本文详细探讨了UNIX系统中的文件缓存(The buffer cache),包括其核心功能——buffer和cache,以及如何利用缓冲区进行流量整形。通过空闲链表(FREELIST)和哈希队列(HASH QUEUE)两种数据结构实现高效的缓存管理,遵循LRU策略。文章介绍了分配和回收buffer的机制,并讨论了多进程同步问题,以及在不同情况下申请和释放buffer的五种场景。最后,文章阐述了使用buffer带来的系统可移植性和性能提升,并预告下篇将实践构建buffer cache的仿真器。" 78264002,6976078,卷积神经网络详解与应用,"['神经网络', '深度学习', '图像识别', '卷积层', 'CNN']

对于UNIX系统来说,最核心的是两个子系统,一个是File subsystem(文件子系统),一个是process control subsystem(进程控制子系统),请看下面这幅图:
这里写图片描述
这幅图基本上讲述了UNIX内核的基本架构,可以看到在file subsystem到block即device drivers(设备驱动)之间有一个明显的buffer cache,我们就来讲讲这个The buffer cache。
先分别讲一讲什么是buffer ,什么是cache。
buffer,中文译名为缓冲,故名思意,buffer的主要功能是为了防止短时间太多的吞吐造成I/O的破坏,起到了流量整形的作用。在the buffer cache里面,buffer体现在将文件流分别一个个大小相同的block,内核在通过buffer获取文件流的时候,不会因为想要获取的文件流的是大文件流还是小文件流,造成device drivers的堵塞。当然,buffer还不止这些作用,他的好处在文最后还会提到。
cache,中文译名为缓存。cache是为了弥补两边存储设备的存储速度的差异的中间存储内存,在file subsystem系统中,主存的存储速度要比硬盘快得多,如果直接内核直接从硬盘反复读取数据,性能会极大的下降。但是利用局部性原理,利用高速的cache暂时的保存数据,让数据能重复使用,减少内存直接与硬盘的交互次数。

那么,the buffer cache的到底是什么呢?
首先,the buffer cache是由一块块的buffer所组成的数据结构,这一块块的buffer含有大小形同的文件数据,记录buffer的相关信息,buffer头的结构如下图:
这里写图片描述
这个看到device num和block num,相关硬盘的device num和block num,表示现在这块buffer存储的数据是那一块block的,下面的status表示现在buffer的状态,是可用的,还是可读的,还是delay write(延迟写,后面会提到)的。
ptr to data area,表示执行buffer数据的指针。
下面分别是维护这些buffer的两个关键数据结构hash queue和free list的相关前后指针(双向链表)。
其次,我们介绍一下维护这些buffer的数据结构,hash queue和freelist.

FREELIST

空闲链表,空闲指的是空闲链表中维护的buffer是空闲的,是可读取其他block(文件)的信息的。那么the buffer cache,cache的功能主要体现在这个freelist上,根据局部性原理,当读取一块数据的时候,后面很大概率是读取这块数据,或者这块数据周围的数据。也就是说,我们很大概率会读取我们最近才读取的数据。
根据局部性原理,我们采用的算法就自然而然的想到了LRU(最少最近访问),一般要实现LRU有两种思路。一是,记录每一块buffer的访问时间,然后在每次取buffer的时候,遍历整个freelist找到时间最少的一块buffer。但是,一旦结点数一多,遍历的时候会成为性能的瓶颈。
所以,这里很巧妙的用双向链表实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值