操作系统磁盘 I/O:为何选择“块“而非“扇区“?

在存储系统中,**扇区(Sector)**是磁盘硬件能够独立寻址和读写的最小物理单元,传统大小为 512 字节,现代磁盘则普遍采用 4096 字节的"高级格式化"(Advanced Format)。然而,操作系统和文件系统并非直接面向扇区进行 I/O 操作,而是引入了一个更大的逻辑概念------块(Block,也常称簇/Cluster)。典型的文件系统块大小为 1KB、2KB 或 4KB,甚至更大。

这种"舍小取大"的设计并非简单的历史遗留,而是操作系统在硬件物理特性、软件开销与上层应用需求之间进行系统性权衡后的结果。


核心概念

特性 扇区 (Sector) 块 (Block)
所在层级 硬件物理层 文件系统逻辑层
典型大小 512B / 4096B 1KB / 2KB / 4KB / 8KB+
管理主体 磁盘固件/控制器 操作系统/文件系统
上层可见性 通常对上层透明 文件系统直接操作单位
核心目的 物理寻址、ECC 纠错 高效 I/O、空间管理、统一抽象
复制代码
┌────────────────────── 块 (Block, 4KB) ──────────────────────┐
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│  │扇区0 │ │扇区1│  │扇区2│ │扇区3│  │扇区4│  │扇区5│ │扇区6│  │扇区7│ │
│  │512B │ │512B │ │512B │ │512B │ │512B │ │512B │ │512B │ │512B │ │
│  └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
└───────────────────────────────────────────────────────────────────┘

主要原因一:减少系统级软件开销

如果将 I/O 粒度缩小到扇区级别(512B),频繁的小数据量读写将使操作系统陷入"软件开销陷阱"。一次完整的磁盘读取在软件层面并非"通知磁盘→拿到数据"这么简单,而是需要穿越多层内核子系统:

复制代码
用户进程
    │
    ▼  系统调用入口(上下文切换、参数校验、权限检查)
VFS 层(虚拟文件系统)
    │
    ▼  页缓存(Page Cache)查找/缺页
文件系统层(ext4/xfs 等)
    │
    ▼  块层(I/O 调度、请求合并)
设备驱动层
    │
    ▼  提交至磁盘控制器(DMA 映射、中断注册)
物理硬件

上述每一层都涉及上下文切换、内存拷贝、中断处理、锁竞争和 DMA 映射。以机械硬盘为例,传输 512 字节数据本身的耗时可能仅需几十微秒,而贯穿整个 I/O 栈的软件开销往往在同一数量级,甚至更高。若每次只读 512B,CPU 的大量时间将消耗在"跑腿"(系统调用与协议处理)上,而非实际的数据传输。

通过将多个扇区聚合成一个逻辑块(如 4KB)进行批量读写:

  • 系统调用频率下降 8 倍(以 4KB 块为例);
  • 中断次数上下文切换次数同比例减少;
  • DMA 传输启动代价被均摊到更多数据上。

现代操作系统中的**页缓存(Page Cache)**通常以内存页(通常为 4KB)为单位进行管理。文件系统块大小与内存页大小对齐,使得磁盘块可以无缝映射到内存页,进一步避免了复杂的拆分与重组逻辑。


主要原因二:屏蔽硬件差异,提供统一抽象

扇区是硬件相关的物理概念,其大小与寻址方式由磁盘厂商决定。然而,存储硬件的物理规格并非一成不变:

  • 传统硬盘:512 字节原生扇区(512n);
  • 高级格式化硬盘:物理扇区 4KB,但逻辑上报 512B(512e),或原生 4KB(4Kn);
  • 固态硬盘(SSD):闪存的最小擦除单位(Block)可能高达 256KB 或 512KB,而编程单位(Page)通常为 16KB;
  • NVMe 或网络存储:暴露给主机的逻辑块大小可能完全不同于底层介质的物理页。

操作系统不可能让文件系统去适配每一种硬件的物理扇区或页大小。通过定义一个与硬件无关的逻辑块(Block),文件系统只需说"我要读第 N 个块",块设备层再负责将其翻译成硬件能理解的物理地址(如 LBA,逻辑块地址)。

扩展:LBA 与物理扇区的解耦

现代磁盘普遍采用 LBA(Logical Block Addressing),操作系统看到的只是一个从 0 到 N 的线性地址空间。磁盘固件内部维护 LBA 到物理扇区(或闪存页)的映射。因此,即使文件系统仍按 512B 的"逻辑扇区"与驱动对话,最终的物理操作单元也由磁盘控制器决定。操作系统的"块"在此之上进一步抽象,让文件系统彻底摆脱对底层物理几何结构(磁头、柱面、每磁道扇区数)的依赖。

这种抽象带来两个直接好处:

  1. 可移植性:同一套文件系统代码可以在 HDD、SSD、U 盘、SD 卡乃至网络块设备上运行;
  2. 未来兼容性:当存储介质物理特性升级时,只需更新设备驱动,无需重写文件系统。

主要原因三:摊销机械延迟,提升 I/O 效率

对于机械硬盘(HDD),磁盘访问耗时由三部分构成:

复制代码
寻道时间(磁头移动到目标磁道)   旋转延迟(盘片旋转到目标位置)   数据传输
      ├───────────────┤            ├───────────────┤           ├────┤
           4-10 ms                       2-5 ms              ~0.02ms/512B

一次随机 I/O 的固定开销(寻道 + 旋转延迟)通常在 10ms 左右,而传输 512 字节本身仅需约 0.02ms。这意味着,如果每次只读取一个扇区,99% 以上的时间都在"等待机械动作",磁盘带宽利用率极低。

将 8 个扇区打包成一个 4KB 的块后:

  • 固定开销基本不变(仍在同一磁道,甚至同一扇区邻域);
  • 数据传输量提升 8 倍;
  • 有效吞吐量近似提升 8 倍(顺序读写场景)。

扩展:IOPS 与吞吐量的关系

磁盘的 IOPS(每秒 I/O 次数)受限于机械延迟,存在理论上限。对于单块 HDD,随机 IOPS 通常在 100 左右。吞吐量 = IOPS × 单次 I/O 大小。因此,在 IOPS 固定的情况下,增大块大小是直接提升吞吐量的有效手段。文件系统采用较大的块,正是为了将宝贵的 I/O 次数"兑换"成更高的实际带宽。


原因四:利用空间局部性,支持预读

程序访问文件数据时往往表现出强烈的空间局部性(Spatial Locality):读取了偏移量 0 处的数据后,接下来很可能读取偏移量 4KB、8KB 处的数据。基于块的操作天然契合这一特征。

操作系统的**预读(Readahead)**机制会在一次块读取时,异步地将相邻的后续块提前载入页缓存。当应用程序真正请求这些数据时,可以直接从内存返回,无需再次访问磁盘。

如果 I/O 粒度仅为 512B,预读策略将变得极为敏感且低效------预读多了浪费内存与总线带宽,预读少了又失去优化意义。4KB 或更大的块为预读算法提供了一个合理的"步长"。


原因五:简化文件系统空间管理

文件系统需要跟踪哪些空间已分配、哪些空闲。若以扇区为粒度管理:

  • **位图(Bitmap)**体积将膨胀 8 倍(相比 4KB 块);
  • Inode 与间接块指针需要记录更多的地址项,元数据开销剧增;
  • 分配与回收算法需要在更细的粒度上处理碎片问题。

以 1TB 磁盘为例:

  • 按 512B 扇区管理:需要约 2G 个条目;
  • 按 4KB 块管理:仅需约 256M 个条目。

更粗的粒度大幅减少了内存中的元数据缓存压力,也加快了文件系统挂载时的扫描速度。


代价:内部碎片与空间换时间的权衡

采用更大的块并非全无代价。**内部碎片(Internal Fragmentation)**是其最主要的问题:即使一个文件只有 1 字节,它也会独占整个块(如 4KB),剩余空间被浪费。

不同块大小的权衡如下:

块大小 内部碎片风险 I/O 效率 元数据开销 典型适用场景
512B 极低 低(软件/机械开销高) 极高 软盘、嵌入式裸设备
4KB 高(现代系统甜点) 通用桌面/服务器(ext4、XFS、NTFS 默认)
64KB+ 极高 极低 视频/数据库大文件、对象存储

操作系统通常将块大小设置为与内存页一致(如 4KB),以此在"磁盘 I/O 效率"与"内存管理对齐"之间取得平衡。对于海量小文件场景,文件系统设计者可能会采用更小的块,或引入子块(Fragment)机制(如早期 UFS),但现代主流文件系统普遍接受 4KB 作为通用最优解。


总结

操作系统选择"块"而非"扇区"作为磁盘 I/O 的基本单位,是一次典型的跨层级抽象与性能优化

  1. 减少软件开销:将多次穿越 I/O 栈的成本均摊到批量数据上,降低 CPU 与内核的负担;
  2. 统一硬件抽象:隔离文件系统与物理存储介质的差异,使操作系统能够兼容 diverse 的存储设备;
  3. 摊销机械延迟:在 HDD 时代,将固定的寻道与旋转成本分摊到更多字节上,最大化磁盘吞吐量;
  4. 支持预读与局部性:匹配程序访问模式,利用页缓存减少实际磁盘访问次数;
  5. 简化元数据管理:降低空间追踪的复杂度,提升文件系统的可扩展性。

理解"块"的存在意义,有助于从系统层面把握存储性能调优的核心:很多时候,磁盘 I/O 的瓶颈并不在磁盘本身,而在于单位 I/O 所能携带的数据量是否足以覆盖软硬件层面的固定开销。

相关推荐
一个人旅程~1 小时前
如何永久关闭bitlocker并防止出现更新后被强制加密?
linux·windows·经验分享·电脑
源远流长jerry1 小时前
TCP 三次握手深度解析:从内核源码到生产实践
linux·运维·网络·网络协议·tcp/ip
黄筱筱筱筱筱筱筱2 小时前
RHCE---web服务器①
linux·运维·服务器
流浪0012 小时前
Linux基础篇(三)轻松拿捏入门级指令
linux·运维·服务器
Waay2 小时前
Linux Shell 知识点考评(三):awk文本分析(附答案)
linux·服务器·编辑器
xlq223222 小时前
53.tcp socket
linux·服务器·开发语言·网络·网络协议·tcp/ip
Shingmc33 小时前
【Linux】传输层协议UDP
linux·网络·udp
Mortalbreeze3 小时前
深度理解进程 ---- 进程优先级、进程切换、进程调度算法
linux·运维·服务器
十年编程老舅3 小时前
深度长文|Linux 图形与显示架构
linux·运维·后端·架构·内核·linux内核·通信机制