Ошибки страницы в OS X при чтении с MMAP - PullRequest
2 голосов
/ 22 сентября 2010

Я пытаюсь сравнить производительность ввода-вывода файловой системы в Mac OS X с помощью mmap.

#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <math.h>

char c;

int main(int argc, char ** argv)
{
        if (argc != 2)
        {
                printf("no files\n");
                exit(1);
        }
        int fd = open(argv[1], O_RDONLY);
        fcntl(fd, F_NOCACHE, 1);
        int offset=0;
        int size=0x100000;
        int pagesize = getpagesize();
        struct stat stats;
        fstat(fd, &stats);
        int filesize = stats.st_size;
        printf("%d byte pages\n", pagesize);
        printf("file %s @ %d bytes\n", argv[1], filesize);
        while(offset < filesize)
        {
                if(offset + size > filesize)
                {
                        int pages = ceil((filesize-offset)/(double)pagesize);
                        size = pages*pagesize;
                }
                printf("mapping offset %x with size %x\n", offset, size);
                void * mem = mmap(0, size, PROT_READ, 0, fd, offset);
                if(mem == -1)
                        return 0;
                offset+=size;
                int i=0;
                for(; i<size; i+=pagesize)
                {
                        c = *((char *)mem+i);
                }

                munmap(mem, size);
        }
        return 0;
}

Идея состоит в том, что я сопоставлю файл или его часть, а затем вызову сбой страницыразыменование это.Я постепенно теряю здравомыслие, поскольку это совсем не работает, и я делал подобные вещи в Linux раньше.

1 Ответ

8 голосов
/ 22 сентября 2010

Измените эту строку

void * mem = mmap(0, size, PROT_READ, 0, fd, offset);

на

void * mem = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, offset);

И не сравнивайте mem с -1.Используйте это вместо:

if(mem == MAP_FAILED) { ... }

Это и более читабельно, и более портативно.

Общий совет: если вы работаете на платформе UNIX, отличной от той, к которой вы привыкли, это хорошоИдея открыть страницу руководства.Для mmap на OS X его можно найти здесь .В нем говорится

Соответствующие приложения должны указывать либо MAP_PRIVATE, либо MAP_SHARED.

Таким образом, указание 0 в четвертом аргументе не OK в ОСX. Я считаю, что это верно для BSD в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...