块层与 I/O 路径

这页讲的是:文件系统最后并不是直接“把字节塞进磁盘”,中间还有块层来组织真正的 I/O 路径。学这页的重点,是理解上层文件请求如何被整理成设备能处理的读写请求。

这块是什么

块层是文件系统与实际块设备之间的重要中间层。它负责把上层产生的 I/O 需求整理、排队、合并、下发给真正设备,让“读一个文件”最终能变成设备控制器和驱动真正能执行的动作。它像交通调度层,把零散请求整理成设备世界能理解的流量。

可以把块层理解成“磁盘交通指挥”:上层不断提出请求,它负责把这些请求排成更可执行的路线和队列。

它负责什么

组织 I/O 请求

  • 把上层读写意图整理成设备请求
  • 维护请求队列
  • 减少乱序和低效访问
  • 让设备面对更可执行的工作单元

衔接文件系统和设备

  • 承接来自文件系统或页缓存路径的 I/O 需求
  • 交给块设备驱动和控制器处理
  • 屏蔽部分底层差异
  • 让上层不必直接操心设备细枝末节

平衡吞吐与延迟

  • 请求合并
  • 排队调度
  • 完成通知
  • 在“快”和“稳”之间找合适路径

为什么文件 I/O 到设备 I/O 之间需要中间层

上层看到的底层真正关心的块层的作用
读一个文件设备要面对的是哪些块、什么顺序、何时提交。把文件语义转成设备级工作单元。
很多小读写请求设备通常更希望看到更合理、可合并的访问模式。减少零碎和低效请求直接砸向设备。
缓存命中或脏页写回底层最终还是要处理真实 I/O 完成。承接写回和读取需求,把它们组织成统一路径。
不同设备特性不同介质和控制器处理能力差异很大。让上层不用直接绑定到某类设备细节。

关键概念

概念现在怎么理解
块设备按块读写数据的设备视角,是很多存储介质被组织进系统的方式。
请求队列设备读写请求在下发前需要有序组织的地方。
I/O 合并把多个零散请求尽量整理得更高效,减少设备处理负担。
写回先在缓存里改、之后再真正落盘的那部分路径。
完成通知设备处理完请求后,需要把结果和状态反馈回系统。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
VFS / 文件系统上层文件请求最终要有一部分沿着块层继续往下走。
内存管理页缓存、回收、写回都会把很多存储行为推到块层路径上。
驱动块层组织好的请求最终仍由具体驱动与控制器去执行。
中断与定时器很多 I/O 完成和后续处理会通过事件触发和异步路径推进。

你现在最该先建立的 I/O 画面

时刻块层在做什么别误会成什么
上层刚发来请求先把文件或页缓存路径给出的意图转成块设备世界能理解的工作单元。别以为这时已经是设备在真正读写了。
很多请求同时涌来块层要决定如何排队、合并、推进,避免设备被零碎访问淹没。别把性能问题只归咎给“磁盘本身太慢”。
设备开始处理组织好的请求被继续交给驱动和控制器落到真实介质。别把块层和具体驱动看成一回事。
请求完成返回完成状态要一路反馈回来,让上层知道哪些 I/O 已经真正结束。别把“发出请求”和“数据已经安全完成”混在一起。

读完这页后,你应该能回答

后面适合继续问:请求队列到底在组织什么?写回路径为什么经常带来性能抖动?块层和具体控制器驱动怎样分工?