Почему в программе, которая отображает файл в память, нет серьезных сбоев страниц? - PullRequest
2 голосов
/ 23 октября 2019

Я пытаюсь продемонстрировать пейджинг в Linux. Я написал небольшую программу, которая отображает файл в виртуальную память с помощью mmap (), ожидает ввода, получает доступ к выделенной памяти и снова ждет ввода.

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

Я ожидал увидеть серьезную ошибку, но я вижу только незначительную ошибку. Количество основных неисправностей остается 0 до завершения программы. Это очень странно, потому что ядро ​​должно выполнить ввод / вывод, чтобы перенести содержимое файла в память.

Может кто-нибудь объяснить это?

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

int main (int argc, char *argv[]) {

  char *mblk;
  int fd, fsize, n;
  struct stat fs;

  fd = open ( argv[1], O_RDONLY );
  if ( fd == -1 ) {
    printf ( "Failed to open %s\n", argv[1] );
    return (-1);
  }

  fstat ( fd, &fs );
  fsize = fs.st_size;
  mblk = mmap ( NULL, fsize, PROT_READ, MAP_PRIVATE, fd, 0 );
  close ( fd );
  printf ( "\n %s is maped to virtual memory at %llx\n", argv[1], (unsigned long long) mblk );
  printf ( " Press Enter to continue\n");
  getchar ();
  n = (unsigned) *mblk;
  printf ( "%d\n", n);
  printf ( " %llx accessed\n", (unsigned long long) mblk );
  printf ( " Press any Enter exit\n");
  getchar ();
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Спасибо, но как страница попадает в кеш страниц? Я попытался запустить программу сразу после перезагрузки. Если открытие в программе загрузило страницу в память, я должен увидеть по крайней мере 1 серьезную ошибку, прежде чем получить доступ к странице.

0 голосов
/ 23 октября 2019

Вы видите незначительный pf, потому что данные уже находятся в кеше страницы.

Попробуйте следующее (console1):

 $ ./main ./myfile 

 ./myfile is maped to virtual memory at 7f23f3cd6000
 Press Enter to continue

После этого удалите кэши (console 2)

$ echo 3 > /proc/sys/vm/drop_caches

Нажмите enter &&, см. Stat (консоль 1)

 98
 7f23f3cd6000 accessed
 Press any Enter exit

 $ ps -eo min_flt,maj_flt,cmd | grep main
 77      1 ./main ./myfile
...