前言

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层架构演变相关推荐

  1. Linux块设备驱动总结

    <Linux设备驱动程序>第十六章 块设备驱动程序读书笔记 简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备 Linux内核视块设备为与字符设备相异的基本设备类型 Linu ...

  2. linux块设备驱动(一)——块设备概念介绍

    linux块设备驱动(一)--块设备概念介绍 本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://bl ...

  3. [转]linux 块设备驱动

    转自 linux块设备IO栈 http://www.sysnote.org/2015/08/06/linux-io-stack/ linux块设备IO流程 驱动 https://www.cnblogs ...

  4. [转]Linux块设备加速缓存bcache和dm-cache:使用SSD来加速服务器

    dm-cache 与 bcache 在 LSFMM 2013 峰会上,Mike Snitzer, Kent Overstreet, Alasdair Kergon, 和 Darrick Wong 共同 ...

  5. 转 Linux块设备加速缓存bcache和dm-cache 使用SSD来加速服务器

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! dm-c ...

  6. linux 块设备驱动(二)——块设备数据结构

    linux 块设备驱动(二)--块设备数据结构 本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块 ...

  7. linux内存加速硬盘缓存,linux块设备加速缓存之bcache

    linux块设备加速缓存之bcache 什么是bcache 转载请注明出处:http://blog.csdn.net/liumangxiong bcache是linux内核块层cache.它使用类似S ...

  8. Linux块设备驱动-MTD子系统

    Linux块设备驱动 块设备驱动 块设备驱动的引入 1. 简单字符驱动程序思想 2. 块设备驱动程序思想 块设备驱动框架 1. 层次框架 2. 分析ll_rw_block 块设备驱动程序编写 1.分配 ...

  9. STM32MP157驱动开发——Linux块设备驱动

    STM32MP157驱动开发--Linux块设备驱动 一.简介 二.驱动开发 1.使用请求队列的方式 2.测试① 3.不使用请求队列的方式 4.测试② 参考文章:[正点原子]I.MX6U嵌入式Linu ...

最新文章

  1. 通讯接口:I2C和USART,SPI,CAN,USB2.0
  2. golang gorm 基本使用
  3. Sublime Text 3 安装Go语言相关插件gosublime时 搜不到gosublime
  4. 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  5. CSDN中最全python字典和实例,让你轻松掌握
  6. 计算机视觉 AI 工具集 OpenVINO™,是你心目中的深度学习框架 Top1 吗?
  7. extjs源码分析-Ext.util.TaskRunner(模拟多线程)
  8. 如何在Python中将元素添加到列表
  9. JAVA使用反射的方法,参数是数组怎么办?
  10. arcengine中测量两个geometry的距离
  11. tuio+ 图片拼接软件制作方法
  12. 互联网人的Q2,被业务目标支配
  13. IBM AIX初级培训总结
  14. ipv6笔记无状态地址自动配置及状态
  15. 你究竟多想成功?(nba励志视频)
  16. 国赛分区赛awd赛后总结-安心做awd混子
  17. 尝试用gdb简单调试程序
  18. 关于 苏生不惑 公众号
  19. 高仿it之家新闻客户端源码
  20. 笔记本电脑无论插、拔耳机后都没有声音,解决方法

热门文章

  1. 被遮挡的绝对定位 z-index
  2. RS 学习笔记 3-1
  3. Cacti Plugin Architecture安装
  4. C语言里最基础的关键字
  5. n皇后问题java_经典n皇后问题java代码实现
  6. 清华大学《操作系统》(八):置换算法
  7. python 多进程并发_python并发编程之多进程
  8. 计算机在输电线路设计中的应用研究,计算机在输电线路基础设计中的应用原稿(备份存档)...
  9. C语言综合期末作业,内蒙古农业大学2010年期末c语言综合作业.doc
  10. BZOJ 1845三角形面积并