为什么要使用mmap而不是fread?

时间:2015-05-21 14:30:12

标签: file c streaming mmap

为什么/什么时候使用mmap()更好,而不是fread()从块中的文件流转换为字节数组?

uint8_t my_buffer[MY_BUFFER_SIZE];
size_t bytes_read;
bytes_read = fread(my_buffer, 1, sizeof(my_buffer), input_file);
if (MY_BUFFER_SIZE != bytes_read) {
    fprintf(stderr, "File read failed: %s\n", filepath);
    exit(1);
}

1 个答案:

答案 0 :(得分:12)

映射文件而不是将其作为流读取是有好处的:

  • 如果您打算对文件的不同宽间距区域执行随机访问,则映射可能意味着只需要实际读取您访问的页面,同时保持代码简单。

  • 如果多个应用程序要访问同一个文件,映射它意味着它只会被读入内存一次,而不是每个应用程序将[部分]文件加载到它自己的私有中的情况缓冲器。

  • 如果文件不适合内存或占用大量内存,那么映射它可以提供适合并简化程序逻辑的错觉,同时让操作系统决定如何管理将文件的位旋转进出物理内存。

  • 如果文件内容发生变化,您可以自动查看新内容。 (这可能是一个可疑的优势。)

映射文件有一些缺点:

  • 如果您只需要对文件进行顺序访问,或者它很小,或者您只需要访问其中的一小部分,那么设置内存映射然后导致页面错误实际导致内容的开销就会增加被阅读的效率低于仅阅读文件的效率。

  • 如果读取文件时出现I / O错误,您的应用程序很可能会在现场被杀死,而不是接收系统调用错误,应用程序可以正常响应。 (从技术上讲,你可以在前一种情况下捕获SIGBUS,但从这种事情中恢复正常并不容易。)

  • 如果您没有使用64位架构并且文件非常大,则可能没有足够的地址空间来映射它。

  • mmap()的可移植性低于read()(您建议的fread())。

  • mmap()仅适用于常规文件(在某些文件系统上)和某些块设备。