mmap на файл с дырками - PullRequest
       78

mmap на файл с дырками

1 голос
/ 09 мая 2020

Я экспериментирую с mmap следующим образом, но не могу понять, правильно ли это:

#include <fcntl.h>  // open
#include <unistd.h> // ftuncate
#include <sys/mman.h>   // mmap

#include <cstdlib>
#include <cstring>
#include <cstdio>


int main(){
    off_t const size = 5 * 1024 * 1024;
    const char *filename = "testfile";

    int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
    ftruncate(fd, size);

    char *mem = (char *) mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, /* offset */ 0);

    const char *msg = "Hello";

    memcpy(&mem[100], msg, strlen(msg));

    memcpy(&mem[200], msg, strlen(msg));

    memcpy(&mem[4 * 1024 * 1024], msg, strlen(msg));
}

Насколько я понимаю, ftruncate создает файл с отверстием. Разве это не проблема для mmap позже?

Будет ли это работать с файлом размером 10 ГБ в 64-битной системе?

На Linux я должен использовать fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, 8 * size) или нет существенная разница в скорости?

1 Ответ

3 голосов
/ 09 мая 2020

Дыры в файлах не влияют на обычные файловые операции, они просто оптимизируют способ хранения файла на диске. Что касается любых операций вроде чтения, поиска, отображения памяти и т. Д. c. обеспокоены, это просто длинная серия нулевых байтов. Драйвер файловой системы позаботится о том, чтобы превратить дыру в блок нулей при чтении соответствующих страниц в память.

Для разницы между fallocate() и ftruncate() см. в чем разница между fallocate и ftruncate

...