gpt4 book ai didi

linux-kernel - 在没有写障碍的情况下,磁盘 Controller 如何处理对同一扇区的并发写入?

转载 作者:行者123 更新时间:2023-12-04 03:14:24 25 4
gpt4 key购买 nike

当我使用 O_DIRECT|O_ASYNC 打开一个文件并对同一个磁盘扇区进行两次并发写入时,中间没有 fsync 或 fdatasync,linux 磁盘子系统或硬件磁盘 Controller 是否提供任何保证最终数据在那个磁盘上磁盘扇区会被二次写入吗?

虽然 O_DIRECT 确实会绕过操作系统缓冲区缓存,但数据最终会进入低级 IO 队列(磁盘调度程序队列、磁盘驱动程序队列、硬件 Controller 的缓存/队列等)。我一直跟踪 IO 堆栈直到电梯算法。
例如,如果以下请求序列在磁盘调度程序队列中结束

write sector 1 from buffer 1  
write sector 2 from buffer 2
write sector 1 from buffer 3 [Its not buffer 1!!]

电梯代码将执行“反向合并”以分别从缓冲区 1,2 合并扇区 1,2。然后发出磁盘两个磁盘IO。但是我不确定磁盘扇区 1 上的最终数据是来自缓冲区 1 还是缓冲区 3(因为我不知道驱动程序/ Controller 的写入重新排序语义)。

场景 2:

write sector 1 from buffer 1  
write sector 500 from buffer 2
write sector 1 from buffer 3

如何处理这种情况?一个更基本的问题是,当使用 AIO 在 O_DIRECT 模式下进行写入时,在没有显式写入障碍的情况下,这个请求序列能否最终进入磁盘调度程序的队列?
如果是,是否有任何顺序保证,如“对同一扇区的多次写入将导致最后一次写入是最终写入”?
还是排序是不确定的[受磁盘 Controller /它的缓存的支配,它会在屏障内重新排序写入以优化寻道时间]

最佳答案

障碍是going away .如果您需要在重叠写入之间进行排序,您应该在发出第二个之前等待第一个完成。 (障碍正在消失。)

在一般情况下,我认为没有保证。从应用的角度来看,最终结果是不确定的,取决于时间、主机和存储设备的状态等。

请求队列将以可预测的方式合并请求,但不需要硬件为同时位于驱动器队列中的写入提供一致的结果。

根据存储设备的速度和主机 CPU 的速度,您不能保证在命令发送到存储设备之前请求队列中会发生合并。

不幸的是,我不清楚使用 O_DIRECT 的应用程序(相对于直接构建 bios 的文件系统)应该如何等待完成。

关于linux-kernel - 在没有写障碍的情况下,磁盘 Controller 如何处理对同一扇区的并发写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com