c - 'write' 函数的正确缓冲区大小是多少?

标签 c linux file io

我在我的代码(Linux 上的 C 语言)中使用低级 I/O 函数“write”将一些数据写入磁盘。首先,我将数据累积在内存缓冲区中,然后在缓冲区已满时使用“write”将数据写入磁盘。那么“写入”的最佳缓冲区大小是多少?根据我的测试,并不是越大越快,所以我来这里寻找答案。

最佳答案

写入文件系统 block 大小的倍数可能有一些优势,特别是如果您正在就地更新文件。如果您向文件写入的内容少于部分 block ,则操作系统必须读取旧 block ,合并新内容,然后将其写出。如果您按顺序快速写入小块,则不一定会发生这种情况,因为更新将在稍后刷新的内存缓冲区上完成。尽管如此,如果您没有在每次写入操作中填充一个 block (以及一个正确对齐的 block : block 大小的倍数,偏移量是 block 大小的倍数),偶尔您可能会触发一些效率低下的情况。

这个传输大小的问题不一定会随着 mmap 消失。如果您映射一个文件,然后 memcpy 将一些数据放入映射中,您就会使页面变脏。该页面必须在稍后的某个时间刷新:不确定何时刷新。如果您制作另一个触及同一页面的 memcpy,该页面现在可能是干净的,而您又使其变脏了。所以它被写了两次。页面大小的倍数的页面对齐副本将是可行的方法。

关于c - 'write' 函数的正确缓冲区大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662425/

相关文章:

c - C 中的输入验证

编译错误指纹

linux - 有没有办法仅通过命令行将本地计算机上的文件复制到远程 Linux?

linux - 如果我为 Raspberry Pi 设置端口转发,我的本地网络会面临哪些潜在风险

Java 文件存储抽象层?

c - 用 C 语言编写的简单变更程序;不明白初始化

c - 三元运算符翻译

linux - enable_irq_wake 和 enable_irq 的区别

image - flutter 如何将 Assets 中的图片保存到内部存储?

c - 一次读取一个二进制文件 1 个字节