zoukankan      html  css  js  c++  java
  • 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应该是包含了所有的块,对此还不是很确定。

  • 相关阅读:
    运行时权限
    访问其他程序中的数据
    第二篇T语言实例开发(版本5.3),福彩3D摇号器
    第一篇T语言实例开发(版本5.3),带错误检测的加减乘除运算器
    第九课,T语言数组的定义与访问(版本5.0)
    第八课,T语言功能和参数(版本5.0)
    第七课第六节,T语言流程语句( 版本5.0)
    第七课第五节,流程语句(版本5.0)
    第七课第四节,T语言流程语句(版本5.0)
    第七课第三节,T语言流程语句(版本5.0)
  • 原文地址:https://www.cnblogs.com/elnino/p/4369279.html
Copyright © 2011-2022 走看看