2012-10-02 2 views
2

내가이 문제를 해결하기 위해 내 머리를 두드리는했다, 심지어 한 단계를 진행할 수없는, 문제는 같은 수 있습니다 :가상 메모리 시스템 페이지 테이블 및 TLB

int X[N]; 
int i; 
int step = M; // M is some predefined constant 
for (i = 0; i < N; i += step) X[i] = X[i] + 1; 
:

다음 C 프로그램을 고려

이 프로그램이 4KB 페이지 크기와 64 항목 TLB가있는 시스템에서 실행되는 경우 M과 N의 어떤 값으로 인해 내부 루프가 실행될 때마다 TLB 누락이 발생합니까?

아무도 나에게 어떤 힌트를 주어도 될까요? 어떻게 해결합니까?

답변

7

간단합니다. 먼저 TLB가 정확히 무엇을 이해해야합니까? 힌트는 virtual addressphysical address으로 변환하는 데 도움이되는 캐시라는 것입니다. 따라서 페이지 크기가 4KB임을 알 수 있습니다. 그래서 배열이 있다면 무한 길이라고 말할 수 있습니다. for 루프에서 0에서 무한대에 액세스하고 있습니다. 배열 X [0]의 첫 번째 액세스는 TLB 누락을 유발하고 첫 번째 TLB를로드합니다. 다음 4095 개의 액세스에 대해서는 TLB에 존재하기 때문에 누락되지 않습니다 (이것은 페이지 크기가 4096 = 4KB이므로 기억하십시오). 그러면 다음 주소는 TLB 미스를 일으키는 X [4096]입니다. 따라서 4096 개의 주소가 증가 할 때마다 TLB 누락이 있음을 알 수 있습니다. 그래서 우리는 그 M = 4096/sizeof(int) 확신합니다.

이제는 64 항목 TLB 캐시가 있음을 알게되었습니다. 따라서 TLB의 64 개 항목이로드 된 후에는 전체 TLB를 갖게됩니다. 65 번째 항목을로드하려면 첫 번째 항목을 제거해야합니다. (다른 대체 메커니즘이있을 수 있습니다. 여기서는 간단한 메커니즘으로 가정합니다). 따라서 65 번째 항목이로드 된 후 X [0]에 액세스 할 때 첫 번째 항목이 제거되었습니다. 따라서 X [0]에 액세스하려고하면 X [4096]에 필요한 항목을 TLB 미스로 교체하는 식으로 진행됩니다. 따라서 TLB 캐시를 완전히 활용하려면 64 * 4096 = 256 KBytes 크기가 필요합니다. 그러나 모든 단계에서 TLB 캐시를 놓치기를 원합니다. 따라서 64 개 항목 TLB 캐시의 경우 65 개의 항목과 동일한 크기의 배열이 필요합니다. 따라서 N = 65 * 4096/sizeof(int).

희망 사항은 몇 가지 힌트를 제공합니다.

+0

TLB 크기가 64 페이지입니다. –

+0

네가 맞습니다. 하지만 65 항목을 사용하여 TLB 캐시를 놓치는 것에 대해 이야기하고있었습니다. 나는 그것에 대한 설명을 업데이트했다. – Raj

+0

이 줄을'TLB에 있기 때문에 놓치지 않습니다. (TLB 크기가 4096 = 4KB이기 때문에 기억하십시오)' –

2

페이지의 가상 주소가 TLB에없는 경우 TLB 누락이 발생합니다.

TLB가 64 개일 경우 가상 주소 0 * 4096, 1 ​​* 4096, 2 * 4096, ..., 63 * 4096으로 완전히 채울 경우 (관련 항목의 메모리에 액세스하여 채워집니다) 페이지 수)를 초과 한 후 가상 주소에서 64 * 4096에서 64 * 4096 + 4095로 액세스를 요청하면 해당 액세스로 인해 TLB 누락이 발생합니다 (64 * 4096이 아직 TLB에 없으므로).

그런 다음 64 * 4096 주소가 저장된 항목 (TLB 미스에 따라 64 개의 항목 중 하나가 제거되고 가상 주소 64 * 4096으로 대체되고 실제 물리적 주소에 해당하는 항목 주소)가 이전에 가상 주소 0 * 4096을 가졌다면 0 ~ 4095의 가상 주소에서 메모리에 액세스하면 또 다른 TLB 미스가 발생합니다 (가상 주소 0 * 4096에 대한 항목이 TLB에서 제거되어 VA 64 항목으로 대체 되었기 때문에) * 4096).

TLB의이 동작을 기반으로 요구 사항을 충족하는 MN을 찾아야합니다.