如何一次性将一页文件写入磁盘?

如何一次性将一页文件写入磁盘?

假设我想将 4096 字节的数据保存在文件中。它应该正好占用一页并且只能刷新一次。但是,如果我使用对内核的多次调用(即逐段写入)来执行此操作,内核可能会中断我的写入以将当前内容刷新到磁盘,然后当我完成写入时,它将再次刷新。因此,为了确保它不会浪费刷新,我只需对内核进行一次调用。那将是write使用write一次是否可以保证该页面只会被标记为脏一次?

man页面提供了一些MAP_UNINITIALIZED我可以一起使用的功能,MAP_FIXED将一些预先写好的页面映射到文件,然后msync将其写入文件,但他们说它仅适用于嵌入式设备。

内核源代码显示write翻译为sys_writewhish翻译为my_syscall3这是一个带有汇编代码的宏,仅填充一些寄存器并写入一行"syscall\n"我不知道如何进一步研究源代码以找到我的问题的答案。

编辑:现在我看到了误解。当我说同花时,我(错误地)并不是真正的同花。我的意思是刷新内核缓存。内核从中选择要刷新的页面的地方。即我只想将该页面标记为脏一次。这正是我想要的。我不想将页面标记为脏然后内核更新,将页面设置为不脏然后我写入更多内容并再次将其标记为脏。我想write原子地。write对于脏页来说是原子的吗?

答案1

相同的手册页:

write() 的成功返回并不能保证数据已提交到磁盘。

不一定有任何一次刷新,并且作为一个用户态进程,您也无法知道存储系统的必要性(硬盘驱动器上的 512 B 块,连续写入文件但由于碎片到磁盘的不同端?超时的网络文件系统?LVM 在 256 个磁盘上复制?)来评估将写入的数据提交到存储需要与存储介质进行多少次物理交互。

唯一可以保证的是,如果您的文件系统做出 POSIX 保证(因此,任何“UNIXy”文件系统,如 XFS、NFS 等),那么在write返回时,刚刚写入的数据必须对之后的读取可见。


在不知道你问的原因的情况下:我也不太清楚为什么你会担心避免刷新 - 文件系统,除非明确告知不要这样做,否则会一直缓存而不是将数据刷新到磁盘,但会高效地批量刷新。因此,很可能您的 4 KB 或更小的写入都不会立即开始写入,除非介质处于活动状态但处于闲置状态。

相关内容