2010-07-09 4 views
0

나는 면접 시험에있는이 질문을 질문 받았다 Plz는 응답을 보낸다 : -페이지 크기를 얻는 방법

당신은 커널의 문서가 없다. 커널이 페이징을 지원한다는 것을 알고있을뿐입니다. 페이지 크기는 어떻게 알 수 있습니까? 페이지 크기에 관해 말할 수있는 플래그 또는 매크로가 없습니다.

시간을 사용하여 답을 얻을 수있는 것처럼 힌트를 받았습니다. 나는 아직 그것에 대한 단서가 없다.

답변

1

실행 코드 :

for (int stride = 1; stride < maxpossiblepagesize; stride += searchgranularity) { 
    char* somemem = (char*)malloc(veryverybigsize*stride); 
    starttime = getcurrentveryaccuratetime(); 
    for (pos = somemem; pos < somemem+veryverybigsize*stride; pos += stride) { 
     // iterate over "veryverybigsize" chunks of size "stride" 
     *pos = 'Q'; // Just write something to force the page back into physical memory 
    } 
    endtime = getcurrentveryaccuratetime(); 
    printf("stride %u, runtime %u", stride, endtime-starttime); 
} 

그래프 Y 축에 X 축과 런타임에 보폭과 결과. stride = pagesize에서 성능이 더 이상 떨어지지 않는 지점이 있어야합니다.

여러 페이지 폴트가 발생합니다. 보폭이 페이지 크기를 초과하면 오류 수가 증가하지 않으므로 프로그램의 성능이 더 이상 크게 저하되지 않습니다.

더 지루하고 싶다면 mprotect 시스템 호출이 전체 페이지에서 작동해야한다는 사실을 악용 할 수 있습니다. 더 작은 것으로 시도해보십시오. 그러면 오류가 발생합니다. 그와 같은 다른 "구멍"도있을 것이라고 확신합니다. 그러나 위의 코드는 페이징을 지원하는 모든 시스템에서 작동하며 디스크 액세스는 RAM 액세스보다 훨씬 비쌉니다. 그것은 모든 신물 현대 시스템이 될 것입니다.

+0

mprotect는 유닉스 시스템에 좋은 점이지만 일반적인 것이 아닙니다. @Borealid @Jon 여러분이 여기에서 설명한 것처럼 비슷한 대답을주었습니다. 페이지 오류 및 성능 기준을 기반으로합니다. 심지어 쓰기/쓰기 작업과 시간을 관련 짓려고했는데 블록으로 작성했지만 그 사람이 감명주지 않았던 것처럼 보입니다. ( – Arpit

0

페이징이 실제로 작동하는 방식에 대한 질문이 내게 들립니다. 페이지 크기를 변경하면 시스템 실행에 미칠 영향을 설명하기를 원합니다.

나는이 물건에 녹슬지 만 페이지가 가득 차면 시스템이 페이지 스와핑을 시작하여 모든 작업 속도가 느려집니다. 그래서 당신은 다른 크기로 메모리를 채울 무언가를 실행하고 작업을 수행하는 데 걸리는 시간을 측정하고자합니다. 어떤 시점에서 작업을 수행하는 데 걸리는 시간이 갑자기 점프되는 점프가 발생합니다.

나는 이렇게하기의 구현에 약간 녹슬 었다고 말했다. 그러나 나는 그들이 그 대답의 형태라고 확신한다. 다음과 같은

+1

가장 기본적인 페이징은 스와핑과 관련이 없습니다. 이것은 물리적 메모리를 고정 크기 청크로 분할하여 각 청크가 자체 특성 (예 : 쓰기 가능, 실행 가능)을 가질 수 있고 가상 메모리 (물리적 메모리와 반대)에서 비 연속적으로 재 배열 될 수 있도록하는 것입니다. 그런 다음 페이지 폴트를 활용하여 스와핑을 구현할 수 있습니다. – wj32

+0

단일 페이지 인 경우가 아니라 실제 RAM이 가득차면 시스템이 스와핑을 시작합니다. – Borealid

0

그들이 무엇을 기대 하던지간에 그것은 거의 확실하게 취성있는 해결책이 될 것입니다. 하나의 경우, 여러 페이지 크기를 가질 수 있으므로, 하나의 작은 할당에 대한 모든 응답은 다음 멀티 메가 바이트 할당과 관련이 없습니다 (Linux의 Large Page 지원과 같은 내용 참조).

최종 솔루션보다는 문제에 어떻게 접근했는지 궁금합니다.

이 질문은 Linux에 관한 것이 아니라 POSIX 준수뿐만 아니라 sysconf (_SC_PAGE_SIZE)를 호출하는 설명서가 있기 때문에 리눅스에 관한 것이 아닙니다.

+0

Stsquad 당신이 옳을 수도 있습니다. – Arpit

관련 문제