들어가며

안녕하세요 이번에는 TLB에 대해서 간단하게 이야기해보려고 합니다.

한번 Paging 글에서 Paging 기법에 대해서 다룬 적이 있었죠. 그런데 이 Page 기법을 이용했을 때 page table에서 매칭되는 page를 탐색하는 것이 생각보다 비용이 많이 드는 작업입니다.

왜냐하면 Paging 글에서 소개해드리지는 않았지만 실제로 page table은 네단계로 구성되기도하여 한번 virtual address에 대응되는 PTE(page table entry)를 찾기 위해서 4번의 메모리 접근을 해야하기때문입니다.

그래서 사람들이 생각한 것이 몇 개의 virtual address에 대해 그에 대응되는 PTE를 저장해놓는 장치가 있으면 적어도 그 virtual address에 대해서는 여러 번의 메모리 접근 없이 바로 PTE를 얻을 수 있으니 유용하지 않을까? 생각했습니다.

그 장치가 바로 TLB라는 장치이며 본 글의 주제입니다.


TLB 파헤치기

TLB는 효과적인가?


TLB의 역할에 대해 간단하게 알려드렸는데 이 TLB는 실제로 효과가 있을까요?

요청된 virtual address가 TLB에 있는 상황을 TLB hit이라고 하는데 실제로 전체 메모리 요청중 99%의 메모리 요청에 대해 TLB hit이 발생한다고 합니다.

어떻게 이런 것이 가능할까요? TLB가 정말 많은 virtual address에 대응되는 데이터를 가지고 있을까요? 그렇지는 않고 TLB는 16~256개의 entry를 가지고 있습니다.

답은 바로 Locality에 있습니다.

Locality라는 개념에는 Temporal localitySpatial locality가 있습니다.

Temporal locality는 최근에 접근된 곳은 곧 또 접근될 것이다라는 것이고, Spatial locality는 접근된 곳 근처는 곧 또 접근될 것이다라는 것입니다.

TLB는 이 Locality에 기반해서 설계되었고, 실제로 메모리 요청들은 이 locality를 보여주기에 TLB는 높은 TLB hit rate를 보여줄 수 있는 것입니다.


TLB 구성


TLB는 어떻게 생겼을까요? 우선 VPN과 PTE를 연결하는 것이니 VPN과 PTE는 존재하겠죠.

추가로 맨 앞에 valid bit가 존재합니다. 이는 해당 tlb entry가 존재하는지 안하는지를 나타냅니다.

그래서 최종적으로 TLB는 아래와 같이 생겼습니다.


전체 구조


그래서 tlb가 포함된 memory access의 전체 구조를 살펴보면

아래와 같이 p를 TLB에서 찾아보고, TLB miss가 발생하게되면 cpu가 page table을 탐색해서 tlb에 다시 해당 엔트리를 채워놓고, 실패했던 메모리 접근을 다시 하게 됩니다.


마무리


이렇게 TLB에 대해 알아보았는데 TLB는 현대 cpu에 항상 붙어있는 핵심적인 장치이므로 반드시 알아두어야합니다. 이번 글도 도움이 되셨으면 좋겠습니다.