2016-11-29 1 views
0

malloc()을 사용하여 50MB의 메모리를 할당 한 후 모든 페이지를 "만지기"위해 루프를 사용하여 소규모 c 프로그램을 만들었습니다. 프로세스의 상주 메모리가 증가하지만 주요 페이지 오류가 없음

int main() 
{ 
    // Map 50M to RAM 
    unsigned char *p = malloc(52428800); 
    sleep(5); 

    // Touch every page 
    for (int i = 0; i< 52428800; i+=4096) 
    p[i] = 1;  
    sleep(100000); 
} 

는 실제로 프로그램은 첫 번째 오초 수면 후 "top 명령"출력 시작에 상주 메모리가 채워 것을 의미하고 결국 RAM의 모든 가상 메모리를 할당 작동하는 것 같다.
PID %MEM VIRT RES CODE DATA SHR            
32486 0.6 55396 52360  4 51528 1104 

나는 프로그램의 페이지 오류를 발견하고 사소한 것들에만있다 :

ps -ef -o min_flt,maj_flt 32486 

MINFL MAJFL 
12879  0 

가 주요 페이지 오류 있어야하지 않나요은? 내가 아는 한 malloc()을 사용할 때 50Mb의 가상 주소 공간이 생성됩니다. 각 가상 페이지에 대한 이전 글은 실제 거주 크기가 매우 작지만 after는 요청 된 가상 메모리와 같습니다.

페이지를 "만지"면 (페이지를 만지기 위해) 각 페이지가 디스크에서 DRAM으로 이동합니다. 맞습니까? 왜 주요 페이지 결함이없는거야?

또한 malloc()을 50m로 설정하고 거주 크기를 알았을 때 몇 킬로바이트 만 남았는데 나머지 페이지는 어디에 있습니까? 그들은 디스크에 있습니까?

답변

0

운영 체제가 malloc 호출을 지원하기 위해 필요없는 페이지를 생성 할 수 있습니다. 디스크에서 강제로 읽기를 수행했습니다.

페이지가 수정 된 후에 두 번째 루프를 시도하여 페이지 오류를 일으키는 지 확인할 수 있습니다.