2016-05-26 11 views
1

ich eine Probe C-Programm geschrieben:Null großen Fehler, wenn mmap eine große Datei in c

Programm: für eine große Datei in 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; 
} 

ich tue "mmap" (welche Größe hat von 11GiB). Wenn ich dieses Programm kompiliere und versuche, wichtige Seitenfehler mit perf zu überprüfen, bekomme ich null.

Perf Befehl:

perf stat -e major-faults ./test 

ich dieses Programm für etwa 30 Sekunden laufen haben und versucht Reihe von großen Seitenfehler von perf gemeldet zu töten, ist gleich Null. Größe meines physischen Gedächtnisses ist 8GiB.

Auch wenn ich eine sehr große Zufallszahl anstelle von 9999 verwende, bekomme ich einen Segmentierungsfehler.

Kann mir bitte jemand vorschlagen, was mache ich hier falsch.

Antwort

1

Das zweite Argument mmap soll die Größe der Datei, die Sie öffnen (in diesem Fall, 11GB oder was auch immer ,,, Sie fseek bis zum Ende oder fstat kann die genaue Größe zu bekommen), nicht auf die Seitengröße . Außerdem denke ich, dass das dritte Argument von mmap mit den Flags open übereinstimmen soll. Sie lesen gerade von der Datei, also würde ich O_RDWR zu O_RDONLY ändern. Es macht Sinn, wenn Sie nur die Seitengröße in die Datei eingeben, erhalten Sie keinen Seitenfehler. Darüber hinaus versucht das Erhöhen des 9999 auf eine zufällige große Zahl wahrscheinlich oberhalb der Seitengröße zu lesen, was den Segfault erklären könnte. Schließlich, am besten, um die Rückkehr von open gegen -1 und die Rückkehr von mmap gegen MAP_FAILED zu überprüfen, bevor Sie fortfahren.