linux源代码阅读笔记 高速缓冲区管理

高速缓冲区是文件系统访问块设备中数据的必经要道,为了访问文件系统等块设备上的数据,内核可以每次都访问块设备,进行读写操作。

为了提高系统性能,内核在内存中开辟一个高速数据缓冲区。在Linux内核中,高速缓冲区位于内核代码和主内存之间。

当需要从块设备中读取数据时,先到高速缓冲区中寻找,若找不到,就发出读块设备命令,块设备将数据写入高速缓冲区中。

高速缓冲区划分为块,每块的大小恰好和硬盘中的存储单元相同。

Linux中,高速缓冲区的实际组织形式较为复杂。

首先看它的结构体:

 56 struct buffer_head {
 57         char * b_data;                  /* pointer to data block (1024 bytes) */
 58         unsigned short b_dev;           /* device (0 = free) */
 59         unsigned short b_blocknr;       /* block number */
 60         unsigned char b_uptodate;       /*weather the data have been refreshed*/
 61         unsigned char b_dirt;           /* 0-clean,1-dirty */
 62         unsigned char b_count;          /* users using this block */
 63         unsigned char b_lock;           /* 0 - ok, 1 -locked */
 64         struct task_struct * b_wait;
 65         struct buffer_head * b_prev;
 66         struct buffer_head * b_next;
 67         struct buffer_head * b_prev_free;
 68         struct buffer_head * b_next_free;
 69 };

 buffer块是以链表形式组织的。分为空闲块和使用块。空闲块以b_prev_free指针,b_next_free指针形成双向链表free_list。

而使用块则以b_prev指针,b_next指针形成双向链表。但是与空闲块不同的是,为了加快使用块的查找速度,系统另外设置了

一个哈希表,该hash表用函数(设备号^逻辑块号)mod 307 对数据块请求进行hash。hash到的块是一组缓冲块所链接成的双向链表,

这些缓冲块拥有共同的哈希值。系统在该双向链表中查找所需求的块(设备号,逻辑号相同),找到,则返回该块,否则去free_list中

申请新的缓冲块。

free_list应该是包含了所有的块,对此还不是很确定。

原文地址:https://www.cnblogs.com/elnino/p/4369279.html