【问题标题】:Block device writes块设备写入
【发布时间】:2025-06-06 21:25:02
【问题描述】:

我正在尝试了解块设备写入的工作原理。我的理解是所有写入都需要扇区对齐。因此,如果扇区大小为 512 字节,则所有写入的大小均为 512 字节。现在让我们说我创建了一个文件并开始按顺序写入其中(在应用程序端没有缓冲)。现在假设我首先在文件的偏移量为零处写入 16 个字节。这如何转化为块级别的写入?在我写入“扇区大小”的数据量然后将其推送到磁盘之前,它是否会被缓冲?如果调用 fsync,是否填充剩余字节然后写出?理解是正确的还是我离题了。

后续问题如下。如果我有一个大小为 64K 的文件。假设我在偏移量 64 处执行 16 字节的随机写入。然后读取 512 字节的适当扇区,将 16 字节写入偏移量 64 处的缓冲区,然后将 512 字节写入磁盘。理解正确吗?

【问题讨论】:

    标签: device block


    【解决方案1】:

    这称为读取-修改-写入:您必须先读取扇区,更改请求的字节,然后将其写回。
    只有在全扇区写入的情况下可以忽略这一步。

    我不了解 Linux,但在 Windows 的情况下,它通常执行缓冲,直到缓冲区已满(缓冲区可能是扇区大小的倍数),或者它完全避免缓冲并抛出如果写入未对齐或不是一个完整的扇区,则异常,具体取决于您是否请求缓冲。

    【讨论】: