我知道内核保证,如果没有中断,一定大小的数据(据说是4096字节的pipe-buf)被原子化地写入,这意味着其他进程试图读取块。
然而,我一直在想,如果我向存储设备写入更多的数据块(比如“abc…[x bytes]…xyz”),那么在内核执行操作的过程中,内核会先写入abc,然后xyz会一直写入吗?
如果没有,那么在写操作完成之前,可能会有其他进程读取“*…[x bytes]…xyz”。我认为,这对许多应用程序来说无疑是一场灾难。
是否有人知道实现,或者,在内核源代码中哪里可以找到答案?
期待您的回复!谢谢!
[更新2011.11.12]
我查看了源代码,但是我不能完全理解它。我发现了调用链“write->vfs_write->do_sync_write[loops]>generic_aio_write[inode_mutex]>>generic_file_aio_write->。->通用执行写入->…->_从用户复制(到,从,n)
_ copy_from_user是一个宏/函数,由依赖于体系结构的asm代码实现,我现在无法理解它们。但我认为编码员会像我们大多数人认为的那样…
希望进一步澄清~

最佳答案

数据可能不会按照您写的顺序被物理地刷新到磁盘上,因此如果机器在写的过程中崩溃,您可能会在系统启动后看到没有“abc”的“xyz”。但是,假设机器保持运行,内核将确保所有的写操作都以正确的顺序发生。

关于linux - Linux Syscall写入:内核是否保证数据写入顺序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8092203/

10-12 00:43
查看更多