在没有写入障碍的情况下,磁盘控制器如何处理对同一扇区的并发写入?
当我用O_DIRECT | O_ASYNC打开一个文件并对同一个磁盘扇区进行两次并发写入时,如果没有fsync或fdatasync,linux磁盘子系统或硬件磁盘控制器是否能保证该磁盘扇区的最终数据将是是第二次写?
虽然O_DIRECT绕过操作系统缓冲区缓存是正确的,但数据最终会在低级IO队列(磁盘调度程序队列,磁盘驱动程序队列,硬件控制器的缓存/队列等)中结束。我已经将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(因为我不知道驱动程序/控制器的写重新排序语义)。
场景2:
write sector 1 from buffer 1
write sector 500 from buffer 2
write sector 1 from buffer 3
如何处理这种情况?
一个更基本的问题是,当使用AIO在O_DIRECT模式下进行写操作时,如果没有明确的写入障碍,这个请求序列是否会在磁盘调度程序的队列中结束?
如果是,是否有任何排序保证,如“对同一扇区的多次写入将导致最后一次写入是最终写入”?
或者是不确定性的排序[留在磁盘控制器/其缓存的左侧,在屏障内重新排序写入以优化寻道时间]
没有找到相关结果
已邀请:
2 个回复
襄挟款籍
蜂佬渺