写入内存映射文件显示 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()
。在缓冲区中构建块并以老式方式将它们写出。
我想使用内存映射文件写入数据。我在 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()
。在缓冲区中构建块并以老式方式将它们写出。