Linux 0.11源码阅读笔记-高速缓冲
高速缓冲
概念
高速缓冲区是内存中的一块内存,在块设备与内核其它程序之间起着一个桥梁作用。内核程序如果需要访问块设备中的数据,都需要经过高速缓冲区来间接的操作。
高速缓冲区结构
高速缓冲区被划分为1k大小的缓冲块,与磁盘块大小一致。高速缓冲区主要包含两部分内容,缓冲块头结构(buffer_head,bh)及其对应的缓冲块。缓冲块用于缓存磁盘数据,并且具有一个缓冲块头结构;缓冲块头结构保存对应缓冲块的元数据。高速缓冲采用hash表和包含所有缓冲块的链表进行操作管理。
缓冲块头结构用于建立内存缓冲块和磁盘被缓冲数据块之间的映射关系,并记录一些访问状态、管理属性。缓冲块头结构具有指向缓冲块的指针,并记录有被缓冲磁盘块的信息,包括磁盘块所属设备号,磁盘块号等,从而建立起映射关系。
- 高速缓冲区结构

- buffer_head信息

缓冲块管理
空闲缓冲块
使用双向链表串联空闲缓冲块头结构,使用b_prev_free和b_next_free指针域。

已分配缓冲块
为支持对缓冲区的高速访问,使用hash表管理已分配缓冲块。根据被缓冲磁盘块所在设备号和逻辑块号,分配的缓冲块被哈希到哈希表中,哈希函数为:(设备号^逻辑块号)Mod 307。使用拉链发处理hash冲突,具有相同哈希值的缓冲块被组织为双向链表,使用b_pre、b_next指针域

缓冲块的访问
当用户程序读文件时会发生什么?
1)read函数读文件时,底层进一步调用bread函数读设备的磁盘块数据。
2)bread调用getblk函数获取缓冲块,若缓冲块数据有效,则直接返回缓冲块头指针;否则调用块设备低层块读写函数ll_rw_block()读写数据到缓冲块中,并等待在该缓冲区上。
唤醒:设备完成读写后,会发出中断,中断处理程序会唤醒等待在缓冲块上的进程
- 内核程序块设备访问操作

- 缓冲区管理函数之间的层次关系
- bread、breada、bread_page:用于读磁盘块,使用方式略有区别
- getblk:获取缓冲块,可能是之前便已分配的缓冲块,存在有效数据;返回的块也可能是新分配的缓冲块,需要进一步调用ll_rw_block函数读写磁盘块数据。
- get_hash_table_find_buffer等:在hash表和双向链表中查找、分配缓冲块。
- brelse:释放缓冲块

总结
- 高速缓冲区用于解决CPU速度和磁盘读写速度不匹配的问题,可提高磁盘访问效率
- 空闲缓冲区管理:高速缓冲区像内存和磁盘一样,被划分为固定的块,使用缓冲块头结构(类似inode节点)记录缓冲块元数据,使用双向链表管理空闲数据库。
- 分配缓冲区管理:高速缓冲区使用hash表+双向链表管理已分配的缓冲块。
- 等待队列:需要从磁盘加载磁盘块数据到缓冲块时,进程将睡眠在缓冲块等待队列上。
- 唤醒机制:磁盘设备完成读数据后,向CPU发出中断,中断处理程序负责唤醒缓冲区等待队列上的进程。
Linux 0.11源码阅读笔记-高速缓冲的更多相关文章
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- Linux 0.11源码阅读笔记-中断过程
Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...
- Linux 0.11源码阅读笔记-总览
Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...
- Linux 0.11源码阅读笔记-总结
总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...
- Linux 0.11源码阅读笔记-内存管理
内存管理 Linux内核使用段页式内存管理方式. 内存池 物理页:物理空闲内存被划分为固定大小(4k)的页 内存池:所有空闲物理页组成内存池,以页为单位进行分配回收.并通过位图记录了每个物理页是否空闲 ...
- Linux 0.11源码阅读笔记-文件IO流程
文件IO流程 用户进程read.write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据. 什么时机将磁盘块数据读到缓冲块? 什么时机将缓冲块数据刷到磁盘块? 函数调用关系 read/write( ...
- Linux 0.11源码阅读笔记-块设备驱动程序
块设备驱动程序 块设备驱动程序负责实现对块设备数据的读写功能.内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据. 块设备的管理 块设备表 内核通过一张 ...
- 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码
从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...
- linux 0.11 源码学习+ IO模型
http://www.cnblogs.com/Fredric-2013/category/696688.html
随机推荐
- .NET的两种部署模式,了解一下
前言 以往部署程序一直是习惯性先安装运行时环境,然后再将发布打包好的程序运行起来:但当多个程序依赖不同版本框架平台时,如果部署在同一台机器上,那就需要在同一台机器上安装多个版本的运行时,总感觉有点不太 ...
- 超强视频超分AI算法,从此只看高清视频
最近发现一个特别强的视频超分算法----BasicVSR,在真实世界数据集中,实现了前所未有的视觉重建效果,最近它还拿下了超分比赛NTIRE 2021三冠一亚的优异成绩,登上了CVPR 2022. 视 ...
- tp5 数据库迁移及数据填充
1:首先通过 composer 安装 原命令加空格 1.* 2:创建 3:填入数据 4:运行,刷新数据库 数据填充: 1:在命令行输入以下命令 composer require fzaninot ...
- nginx 如何访问php文件
1.进入nginx安装路径,我的是/usr/local/nginxvi conf/nginx.conf将 location ~ \.php$ { root html; fastcgi_pass 127 ...
- 番茄钟的实现(基于Xilinx EGO1学习板)
番茄钟设计 一.总体设计 1.番茄工作法简介 番茄工作法由意大利的奇列洛创造.其内容就是:工作25分钟休息5分钟,循环四次后休息15分钟. 本项目就是基于Xilinx Ego1开发板实现一个计时器,该 ...
- OSPF协议原理及配置2-理解邻居和邻接关系
OSPF是一个动态路由协议,运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前首先需要建立邻接关系.邻接关系用来交换链路状态及路由信息. 注意:并非所有的邻居关系都可以成为邻接 ...
- 36 异常机制 自定义异常 实际应用中的经验总结 尽量添加finally语句块去释放占用的资源
自定义异常 概念 使用Java内置的异常可以描述在编辑时出现的大部分异常情况.除此之外,用户还可以自定义异常.用户自定义异常类,只需继承Exception类即可. 在程序中使用自定义异常类,大体可分为 ...
- LGP3449题解
其实每个串都不是回文串也能做的说... 题意:给定 \(n\) 个互不相同的串,两两拼接一共能够拼出 \(n^2\) 个串,问这 \(n^2\) 个串中有几个回文串. 首先假设拼接出来的串是 \(AB ...
- 『现学现忘』Docker基础 — 27、Docker镜像的commit操作
目录 1.commit命令作用 2.commit命令说明 3.示例演示 1.commit命令作用 在运行的容器中,并在镜像的基础上做了一些修改,我们希望保存起来,封装成一个新的镜像,方便我们以后使用, ...
- 6张图为你分析Kafka Producer 消息缓存模型
摘要:发送消息的时候, 当Broker挂掉了,消息体还能写入到消息缓存中吗? 本文分享自华为云社区<图解Kafka Producer 消息缓存模型>,作者:石臻臻的杂货铺. 在阅读本文之前 ...