c - 关于通过 mmap(2) 优化文件读写的问题?

标签 c macos mmap

我的代码优化遇到一些问题。我会尽力解释我所处的场景。如果不清楚,请询问。

问题很直接。以前,我在同一进程中打开了 2 个单独的文件,并分别对这两个文件调用 mmap(2)。与第二个映射相比,第一个映射的访问频率更高。(读取和写入) 我想进一步优化代码,而不是使用两个单独的文件,我可以简单地将第一个文件的内容(与第二个文件相比,其大小非常小)放在第二个文件的开头,并将第二个文件的根目录向前移动所需的偏移量。 这将避免使用 2 个文件,从而避免调用 open(2)mmap(2)。由于此设置代码(调用 open(2)mmap(2))将被调用至少 100,000 次以上,因此删除这 2 个调用应该很重要。但我不知道为什么对我转移到第二个文件开头的部分的访问变得慢得多。在 google 上,我在某处读到这可能是某些页面缓存的情况,但我不确定是否是这种情况,因为写入操作几乎慢了 10-20 倍。请建议我如何改进?

更新:

根据我过去进行的测试,使用两个文件或一个文件并没有太大区别。我认为这个问题需要深入研究 mmap 如何处理页面。

最佳答案

您可以使用同一映射中的两个指针:

int len = 1300,
    off = 600,
    prot = PROT_READ | PROT_WRITE,
    flags = MAP_SHARED,
    fd = open("file", O_RDWR);
char *map = mmap(NULL, len, prot, flags, fd, 0),
     *map2 = map + off;

*map = 'a';
*map2 = 'b';

不要使用 offset 参数,除非它是页面大小的倍数(通常为 4096)。

关于c - 关于通过 mmap(2) 优化文件读写的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56757651/

相关文章:

c - 如何使用mmap加载的共享库

c - NetBSD 上的 libmagic 关闭文件描述符

c - 输出与 MCQ 中给出的选择不匹配

c - JNI : calling C from java

c# - 在 C# StringBuilder 结构体中导入 C dll

macos - 如何使用命令重启 Docker-for-mac?

c - LibUSB 驱动程序问题 : timeout

c# - 错误 文件 'Resources/LaunchScreen.xib' 与 'Resources/LaunchScreen.xib' 冲突。 iOS Xamarin

python - MacOs Tkinter - 应用程序终止 'Invalid parameter not satisfying: aString != nil'

c - 未使用的内存空间中存储的值是什么?