Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 在没有写屏障的情况下,磁盘控制器如何处理对同一扇区的并发写操作?_Linux Kernel_Non Deterministic_Aio_Concurrentmodification - Fatal编程技术网

Linux kernel 在没有写屏障的情况下,磁盘控制器如何处理对同一扇区的并发写操作?

Linux kernel 在没有写屏障的情况下,磁盘控制器如何处理对同一扇区的并发写操作?,linux-kernel,non-deterministic,aio,concurrentmodification,Linux Kernel,Non Deterministic,Aio,Concurrentmodification,当我用O|u DIRECT | O|u ASYNC打开一个文件并对同一磁盘扇区进行两次并发写入时,中间没有fsync或fdatasync,linux磁盘子系统或硬件磁盘控制器是否保证该磁盘扇区上的最终数据将是第二次写入 虽然O_DIRECT确实绕过了操作系统缓冲区缓存,但数据最终会进入低级IO队列(磁盘调度程序队列、磁盘驱动程序队列、硬件控制器缓存/队列等)。我一直追踪IO堆栈到电梯算法。 例如,如果以下请求序列在磁盘计划程序队列中结束 write sector 1 from buffer 1

当我用O|u DIRECT | O|u 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。然后发布两个磁盘IOs。但我不确定磁盘扇区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模式进行写入时,在没有明确写入障碍的情况下,这一请求序列是否会在磁盘计划程序的队列中结束?
如果是,是否有任何订购保证,如“对同一扇区的多次写入将导致最后一次写入为最终写入”

或者,排序是不确定的[由磁盘控制器/其缓存决定,这些缓存在屏障内重新排序写入以优化寻道时间]

好的,写入请求最终进入线性提升队列。在这一点上,它们是否来自不同的线程并不重要。同样的安排可能是单个线程发出三次连续写入的结果。现在,您会将您的文件信任给一个操作系统还是一个控制器,该控制器会以某种任意方式将顺序写入重新排序到同一扇区?我不会,但我当然可能错了:)

障碍是存在的。如果需要在重叠写入之间排序,则应该等待第一次写入完成后再发出第二次写入。(障碍正在消失。)

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

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

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


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

事实上,硬件不能保证对同一扇区的排队写入之间的时间顺序。我发现这相当令人惊讶,但LSF2010至少有3名内核黑客同意这一点。如果文件系统在意,它应该等待完成(尽管它以前可以使用屏障)。使用O_DIRECT的应用程序大概也是如此。当然,内核请求队列可能会在重叠的请求到达硬件之前合并它们,因此这种行为可能很难看到。wrt bios,如果缓冲区是缓冲区缓存页(不属于应用程序),内核会分散收集并锁定缓冲区。此外,我相信IOMMU会要求cpu(语义上)将页面设置为“无访问”,直到DMA完成。否则,对于正常的mmaped写入,将有大量的争用。对于非mmaped写入,它是到内核空间(dmabuffers)的缓冲区拷贝,好吗