2016-05-26 7 views
1

Я написал программу образца C:Нулевой основные ошибки при ММАП большой файл в с

Программа:

#include<stdio.h> 
#include<stdlib.h> 
#include <unistd.h> 
#include<time.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include<inttypes.h> 
int main() 
{  
    int fd; 
    char *data; 
    fd = open("file.txt", O_RDWR); 
    int pagesize = getpagesize(); 
    data = mmap((caddr_t)0, pagesize, PROT_READ, MAP_SHARED, fd, pagesize); 
    srand(time(NULL)); 
    while(1) 
    { 
     int r = (rand() % 9999) + 1; 
     char x = data[r]; 
    } 
    return 0; 
} 

Я делаю «ММАП» для большого файла в C (который имеет размер из 11GiB). Когда я скомпилирую эту программу и пытаюсь проверить основные ошибки страницы, используя perf, я получаю нуль.

Perf команда:

perf stat -e major-faults ./test 

я запустить эту программу в течение приблизительно 30 секунд и пыталась убить, количество основных ошибок страниц сообщенной перфорации равно нуль. Размер моей физической памяти - 8 ГБ.

Также, если я использую очень большое случайное число вместо 9999, я получаю ошибку сегментации.

Может кто-нибудь, пожалуйста, предложите мне, что я делаю неправильно здесь.

ответ

1

2-й аргумент mmap должен быть размером файла, который вы открываете (в данном случае, 11GB или что-то ,,, вы можете fseek до конца или fstat, чтобы получить точный размер), а не размер страницы , Кроме того, я думаю, что третий аргумент mmap должен соответствовать флагам open. Вы просто читаете из файла, поэтому я бы изменил O_RDWR на O_RDONLY. Имеет смысл, что если вы только mmap, занесенный в файл, вы не получите ошибку страницы. Более того, увеличение числа 9999 до случайного большого числа, вероятно, пытается прочитать выше страницы, что может объяснить segfault. Наконец, лучше проверить возврат с open против -1 и возврат с mmap против MAP_FAILED перед продолжением.