Linux 块设备,Block Layer层架构演变
前言
Block Layer层在整个I/O中负责承上启下,上接文件系统,下接块驱动。
我不想直接讨论代码,希望从一个架构的演变来初探一下Block Layer层。
一、1.0版本
首先我们来了解几个重要的数据结构
1.1 bio
bio代表了一次I/0请求,代表一个块设备的一个扇区或者多个连续扇区的数据请求,扇区是块设备的最小访问单元,bio是文件系统发给Block Layer层的。
1.2 request
request代表块设备可以处理的一次任务单元,一个request由一个bio或者多个扇区相连的bio组成。
1.3 架构图
1.4 小结
Block Layer将文件系统提供的bio变成request,然后交给块设备驱动处理。
二、2.0版本
目前只支持单个进程访问块设备。为了可以支持多进程,我们在块设备驱动中创建一个队列:request_queue,所有的进程发起bio生成的request,会被投递到request_queue,块设备循环处理request_queue中的request。
2.1 request_queue
每一个块设备都有一个工作队列,request_queue,保存准备就绪待处理的request。
2.2 架构图
2.3 小结
这样子就实现了多个进程同时访问块设备,而且在新的一个bio变成request之前,可以先看看该bio能否合并到request_queue的某个request,这样子就可以提升bio处理的效率。
三、3.0版本
好像看起来2.0已经挺完美了,但是request_queue会有一把锁控制,如果多个进程短时间发起多个bio,多个进程不断竞争锁,这样子性能不是很好,我们就引入了plug。
3.1 plug
plug翻译成中文就是塞子,每一个进程会有一个plug,plug是一个request的list,先将一个进程短时间发起的所有bio生成request先堆积到当前进程的plug list,然后在等待特定时机释放plug中的requests到request_queue,这样子可以提升bio处理的效率。
3.2 架构图
3.3 小结
架构越来越完美了,除了上面的流程,在新的一个bio变成request之前,先看看能不能合并到plug里面的某个request中,如果不行在,再看看能否合并到request_queue里面的某个request中,如果不行再变成request,然后放到plug list中,等待积攒一定量之后,统一放置request_queue里面。
四、4.0版本
看起来好像3.0已经很完美了,但是我们会发现3.0有两个明显的优化点。
优化点1:
传统的块设备是机械磁盘,这种硬件是靠一个磁头不断移动进行访问数据的,如果我们可以把所有request排序,这样子就可以提升块设备的访问效率。
举个例子:一个外卖员需要送很多外卖到一个办公楼,他将外卖按楼层排序合并,然后一层层的送,肯定比随机拿一个外卖,然后一层层的送的速度快。
优化点2:
每个块设备单位时间处理request的次数是有限的,如果我们可以提升前台的进程request被处理的优先级,这样子就可以带来更好的用户体验。
4.1 scheduler
翻译成中文就是调度器,scheduler就是可以解决上述的两个优化点,scheduler会在内部创建自定义的各种队列来存放plug释放出来的request,然后scheduler对这个所有的request进行一个调度,按照特定的规则再分发给request_queue,让块设备处理。
4.2 架构图
4.3 小结
有了scheduler,我们就可以实现所有request的重新排序甚至合并,还可以对不同进程的request进行不同的优先级控制,目前linux支持的scheduler有:CFQ,deadline等
5、总结
学习Block Layer层,其实就是学习以上几个重要的部分:bio,request,plug,scheduler,request_queue,而且linux的single-queue架构就是和4.0版的架构差不多,目前手机上基本采用这个single-queue的架构。
linux目前除了支持single-queue,还支持multi-queue,我就不展开讲的,整体的结构很类似。
6、尾巴
整个流程好像看起来很爽,其实我们根本没有关注过进程的调度,我说的进程就是task_struct,多个进程同时发送bio,最后将bio变成request送给了scheduler进行调度,这些代码运行在各自的进程上,然后scheduler再将request分发给块设备处理这个又运行在另一个单独的进程上。如何让多个进程发完request之后休眠,如何让块设备驱动处理完之后唤醒这些休眠的进程。这个唤醒的关键点:在于bio结构体中的bio_end_io_t *bi_end_io这个callback函数指针。
回复「 篮球的大肚子」进入技术群聊
回复「1024」获取1000G学习资料
Linux 块设备,Block Layer层架构演变相关推荐
- Linux块设备驱动总结
<Linux设备驱动程序>第十六章 块设备驱动程序读书笔记 简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备 Linux内核视块设备为与字符设备相异的基本设备类型 Linu ...
- linux块设备驱动(一)——块设备概念介绍
linux块设备驱动(一)--块设备概念介绍 本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://bl ...
- [转]linux 块设备驱动
转自 linux块设备IO栈 http://www.sysnote.org/2015/08/06/linux-io-stack/ linux块设备IO流程 驱动 https://www.cnblogs ...
- [转]Linux块设备加速缓存bcache和dm-cache:使用SSD来加速服务器
dm-cache 与 bcache 在 LSFMM 2013 峰会上,Mike Snitzer, Kent Overstreet, Alasdair Kergon, 和 Darrick Wong 共同 ...
- 转 Linux块设备加速缓存bcache和dm-cache 使用SSD来加速服务器
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! dm-c ...
- linux 块设备驱动(二)——块设备数据结构
linux 块设备驱动(二)--块设备数据结构 本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块 ...
- linux内存加速硬盘缓存,linux块设备加速缓存之bcache
linux块设备加速缓存之bcache 什么是bcache 转载请注明出处:http://blog.csdn.net/liumangxiong bcache是linux内核块层cache.它使用类似S ...
- Linux块设备驱动-MTD子系统
Linux块设备驱动 块设备驱动 块设备驱动的引入 1. 简单字符驱动程序思想 2. 块设备驱动程序思想 块设备驱动框架 1. 层次框架 2. 分析ll_rw_block 块设备驱动程序编写 1.分配 ...
- STM32MP157驱动开发——Linux块设备驱动
STM32MP157驱动开发--Linux块设备驱动 一.简介 二.驱动开发 1.使用请求队列的方式 2.测试① 3.不使用请求队列的方式 4.测试② 参考文章:[正点原子]I.MX6U嵌入式Linu ...
最新文章
- 通讯接口:I2C和USART,SPI,CAN,USB2.0
- golang gorm 基本使用
- Sublime Text 3 安装Go语言相关插件gosublime时 搜不到gosublime
- 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- CSDN中最全python字典和实例,让你轻松掌握
- 计算机视觉 AI 工具集 OpenVINO™,是你心目中的深度学习框架 Top1 吗?
- extjs源码分析-Ext.util.TaskRunner(模拟多线程)
- 如何在Python中将元素添加到列表
- JAVA使用反射的方法,参数是数组怎么办?
- arcengine中测量两个geometry的距离
- tuio+ 图片拼接软件制作方法
- 互联网人的Q2,被业务目标支配
- IBM AIX初级培训总结
- ipv6笔记无状态地址自动配置及状态
- 你究竟多想成功?(nba励志视频)
- 国赛分区赛awd赛后总结-安心做awd混子
- 尝试用gdb简单调试程序
- 关于 苏生不惑 公众号
- 高仿it之家新闻客户端源码
- 笔记本电脑无论插、拔耳机后都没有声音,解决方法