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
随机推荐
- Spring源码之七registerListeners()及发布订阅模式
Spring源码之七registerListeners()及发布订阅模式 大家好,我是程序员田同学. 今天带大家解读refresh()方法中的registerListeners()方法,也就是我们经常 ...
- Chapter09 项目
Chapter09 项目 房屋出租系统(面向对象中级) 9.1 房屋出租系统-需求 9.1.1项目需求说明 实现基于文本界面的<房屋出租软件>. 能够实现对房屋信息的添加.修改和删除(用数 ...
- LeetCode-268-丢失的数字
丢失的数字 题目描述:给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数. 进阶: 你能否实现线性时间复杂度.仅使用额外常数空间的算法解 ...
- Spring注解简析
JAVA 元注解 @Documented @Inherited @Retention @Target @Repeatable @Native 在java.lang.annotation包下,除了@Na ...
- 【爬虫】python爬虫
爬虫章节 1.python如何访问互联网 URL(网页地址)+lib=>urllib 2.有问题查文档:python document. 3.response = urllib.request. ...
- gitee中项目到运行操作,包括:打包、热部署、数据库操作
使用的工具:window10.IDEA 2018.2.3 .navicat110_premium.Git-2.23 1.idea导入gitee代码 复制项目地址 选择git工具 粘贴地址,点击clon ...
- AngularJS集成富文本编辑器
最近在Angular中需要集成富文本编辑器,本来已经集成好百度的UEditor,后台觉得配置太多,让我弄个别的,然后就找到了wangEditor,这个配置和上手都要简单一些,下面来看看具体操作步骤吧: ...
- ArcMap操作随记(4)
1.统计各省份公路长度 [标识]→[汇总]→[视图][创建] 2.用户登录分配 [创建渔网]→[连接] 3.城市超市影响范围 [创建泰森多边形]→[标识]→[汇总] 4.三维可视化分析 [构造视线]→ ...
- Spring Boot 中初始化资源的几种方式
假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...
- Docker——网络
docker0 查看主机的ip [root@iZwz908j8pbqd86doyrez5Z test]# ip addr #本机回环地址 1: lo: <LOOPBACK,UP,LOWER_UP ...