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

为了提高系统性能,内核在内存中开辟一个高速数据缓冲区。在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

linux源代码阅读笔记 高速缓冲区管理相关推荐

  1. linux源代码阅读笔记 find_entry分析

    78 static struct buffer_head * find_entry(struct m_inode * dir,79 const char * name, int namelen, st ...

  2. 非常好!!!Linux源代码阅读——环境准备【转】

    Linux源代码阅读--环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...

  3. Linux 源代码阅读知识点及要求

    说明:1.本次源代码阅读,以Linux 最新的稳定版本(2.6)为主: 2.源代码下载地址: 在官方站点 www.kernel.org 上最新稳定版本是 2.6.13.2: 在清华的 ftp 上随时都 ...

  4. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读--内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  5. linux 内核round-robin scheduler代码,LINUX源代码阅读报告

    进程调度代码分析 --关于LINUX源代码中进程调度部分的读书报告 在多进程的操作系统中,进程调度是一个全局性.关键性的问题,它对系统的总体设计.系统的的实现.功能设置以及各个方面的性能都有着决定性的 ...

  6. linux源代码阅读组合vim tags taglist

    vim+ctags+taglist 在linux下构建类似于windows sourceinsight的源码阅读环境 /***********************************/ /** ...

  7. Flask 源代码阅读笔记

    我认为我已经养成了一个坏习惯.在使用一个框架过程中对它的内部原理非常感兴趣,有时候须要花不少精力才 明确,这也导致了学习的缓慢,但换来的是对框架的内部机理的熟悉,正如侯捷所说,源代码面前,了无秘密.这 ...

  8. linux源码阅读神器,Ubuntu下安装LXR Linux源代码阅读利器

    1.安装apache2 sudo apt-get install apache2 2.安装lxr sudo apt-get install lxr 3. 在/etc/apache2/httpd.con ...

  9. OBS源代码阅读笔记

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. obs配置文件加载:bool OBSBasic::InitBasicConfig(); OBS认证信息加载,貌似还没有实 ...

  10. Vector和LinkedList源代码阅读笔记

    Vector 1 三个成员变量 elementData: Container elementCount: 有效长度 capacityIncrement: 每次增加的长度 2, 其构造函数没什么特别的, ...

最新文章

  1. 如何快速优化机器学习的模型参数
  2. c mysql显示多条数据_用一条mysql语句插入多条数据
  3. Caffe学习记录(十二) ICNet分割网络学习二
  4. jemter编写Mysql脚本___传参
  5. 前端技术周刊 2018-03-02
  6. 猎八哥浅谈存储过程——数据库中的双刃剑
  7. phpstorm配置Xdebug
  8. VTK:PolyData之ParametricSpline
  9. ubuntu如何解压.tar.gz
  10. #UML# Astah+Doxygen 将C++源码映射为类图
  11. 揭秘win10系统CPU占用100%的真正原因/找出那些罪魁祸首
  12. idea php 提示丢失,解决idea 暂存文件或idea切换分支代码丢失的问题
  13. 关闭 Eureka 的自我保护机制
  14. 好用的读书笔记app精选
  15. 如何学习自然语言处理:一本书和一门课
  16. 如何在九酷·轻音乐上下载MP3格式的音乐素材?
  17. HTTPS与自制SSL证书
  18. 使用pandas模块实现数据的标准化
  19. Get Offer —— 能力素质考核训练
  20. 线性系统理论 matlab,线性系统理论.pdf

热门文章

  1. ubuntu16.04安装驱动
  2. matlab preparets,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?
  3. foreach php 多重数组,PHP的foreach与多维数组
  4. android刷新界面的几种方法,Android UI更新的几种方法
  5. 获取android设备唯一编号_如何获取Android设备唯一识别码
  6. 施密特正交化_夜思 | 为什么非实对称矩阵对应的特征向量不能施密特正交化?...
  7. 数字图像处理与python实现 pdf_python数字图像处理实现直方图与均衡化
  8. 【Django 2021年最新版教程15】数据库定义 models字段类型 限制 用法 总结
  9. 区块链 以太坊 虚拟机 EVM 为什么256条指令
  10. kubernetes 容器持久化存储PV、PVC、StorageClass