据我所知,当进程写入文件时,它会启动系统调用。在所需的信息中,它需要一个指向用户空间中的缓冲区的指针,其中填充了要写入的数据。
考虑一个场景,其中有一个进程生成两个线程。一个线程执行系统调用写入 10MB。当操作系统正在处理 IO 请求时,另一个线程执行无效的内存访问,从而触发分段错误。在这种情况下写请求会发生什么?特别是,我可以保证写操作不会发生或者在进程内存释放之前完成?如果 io 请求只是一个 64 位整数,答案会改变吗?
答案1
目前,文件系统上的操作是不可中断的——网络文件系统除外。
看TASK_KILLABLE
[LWN.net,2008]。
对于传统的基于块的文件系统,您可能会预测您的保证将会得到满足。我不认为TASK_KILLABLE
它在网络文件系统之外被广泛采用。然而,如果没有充分的理由,我不想假设情况总是如此。
如果应用程序有可能在网络文件系统上运行,则很难说有强有力的保证。 (一般来说,例如注意NFS3 并未遵循 POSIX 文件系统的所有期望)。
存储技术仍在不断发展。例如,如果您根据 Linux 块层的架构假设文件系统将以某种方式工作,那么将来当您的应用程序在 Linux 上运行时,您可能会感到惊讶基于字节寻址内存的文件系统。