주요 페이지 오류를 생성합니다.

주요 페이지 오류를 생성합니다.

Linux 커널이 뜻대로 중요한 페이지 오류를 생성할 수 있습니까? 실행 시 주요 페이지 오류를 발생시키는 것이 보장되는 프로그램을 작성하는 것이 가능합니까?

답변1

주요 페이지 오류를 생성하려면 디스크에서 강제로 읽어야 합니다. 다음 코드는 명령줄에 제공된 파일을 매핑하여 파일이 필요하지 않다고 커널에 알립니다. 파일이 충분히 크면( 에서 큰 파일 선택 /usr/bin) 항상 주요 페이지 오류가 발생합니다.

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

int main(int argc, char ** argv) {
  int fd = open(argv[1], O_RDONLY);
  struct stat stats;
  fstat(fd, &stats);
  posix_fadvise(fd, 0, stats.st_size, POSIX_FADV_DONTNEED);
  char * map = (char *) mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
  if (map == MAP_FAILED) {
    perror("Failed to mmap");
    return 1;
  }
  int result = 0;
  int i;
  for (i = 0; i < stats.st_size; i++) {
    result += map[i];
  }
  munmap(map, stats.st_size);
  return result;
}

오류 처리 방법은 많지 않습니다. 이는 단지 아이디어를 보여주기 위한 것입니다. 내 시스템에서는

gcc majorfault.c -o majorfault && /usr/bin/time -v ./majorfault /usr/bin/git-annex

항상 154개의 주요 페이지 오류를 생성합니다.

답변2

이 C 프로그램은 내 Mac의 메모리 압력 그래프에서 PDQ 스파이크를 발생시킵니다.

#include <stdlib.h>

int main(void)
{
    while (1) {
        char* p = malloc(1 * 1024 * 1024 * 1024);
        for (int i = 0; i < 1024; ++i) {
            p[i * 1024 * 1024] = 0;     /* touch the pages */
        }
    }
    return 0;
}

내부 순환이 중요합니다. 할당된 메모리 페이지 중 적어도 일부를 건드리지 않으면 메모리 관리 하위 시스템은 사용자가 전혀 사용되지 않는 메모리를 요청하고 있다는 것을 깨달을 만큼 똑똑해집니다. 그러나 이는 OS X 관련 구현 세부 사항일 가능성이 높습니다.

관련 정보