写入内存映射文件显示 htop 中的读取访问

Writing to a memory mapped file shows read accesses in htop

我想使用内存映射文件写入数据。我在 ubuntu 机器上使用以下测试代码。代码使用 g++ -std=c++14 -O3 .

编译
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstdlib>
#include <cstdio>
#include <cassert>

int main(){
    constexpr size_t GB1 = 1 << 30;

    size_t capacity = GB1 * 4;
    size_t numElements = capacity / sizeof(size_t);

    int fd = open("./mmapfile", O_RDWR);
    assert(fd >= 0);

    int error = ftruncate(fd, capacity);
    assert(error == 0);

    void* ptr = mmap(0, capacity, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    assert(ptr != MAP_FAILED);

    size_t* data = (size_t*)ptr;

    for(size_t i = 0; i < numElements; i++){
        data[i] = i;
    }

    munmap(ptr, capacity);
}

数据正在正确写入文件。但是,htop 命令显示程序的一半磁盘 io 带宽被读取访问使用。我担心的是,如果只有一半的带宽可用于写入,代码将无法正常运行。

为什么代码中有读取权限? 它们可以避免还是可以预期?

发生读取访问是因为第一次访问页面时需要从磁盘读取它们。 OS不明眼,不知道reads会被扔掉

为避免此问题,请勿使用 mmap()。在缓冲区中构建块并以老式方式将它们写出。