관리 메뉴

개발자비행일지

TLB(Translation -Lookaside Buffer) 변환- 색인 버퍼 본문

▶ Computer Science

TLB(Translation -Lookaside Buffer) 변환- 색인 버퍼

Cyber0946 2020. 6. 30. 21:02

 

페이징은 프로세스의 주소공간을 고정된 크기페이지로 나누고, 각 페이지가 존재하는 물리 메모리주소와 프로세스와 매핑해주는 과정이다. 이 때, 필요한 정보들을 메모리에 잇는 페이지 테이블 이라는 자료구조에 저장한다. 이 페이지테이블은 프로세스 별로 존재하는데 실행될 때 마다 새로운 페이지테이블에 접근하는 과정을 반복하는 것은 프로세스 실행속도 면에 있어서 큰 오버헤드이기 때문에 운영체제의 속도개선을 위한 알고리즘으로 등작한 것이 TLB(Translation-Lookaside Buffe)이다. 

위 그림처럼 CPU에서 명령을 수행하는 과정에서 가상메모리 주소를 실제주소로 변환하는 과정을 담당하는 MMU(Memory Management Unit)은 TLB를 참조한다. 

가상주소변환은 아래와 같은 알고리즘으로 이루어진다.

  1. VPN = (VirtualAddress & VPN_MASK) >> SHIFT 2

  2. (Success, TlbEntry) = TLB_Lookup(VPN)

  3. if (Success == True) // TLB HIT!

  4.     if (CanAccess(TlbEntry.ProtectBits) == True)

  5.         Offset = VirtualAddress & OFFSET_MASK

  6.         PhysAddr = (TlbEntry.PFN << SHIFT) | Offset

  7.         AccessMemory(PhysAddr)

  8.     else

  9.         RaiseException(PROTECTION_FAULT)

  10. else // TLB MISS;

  11.     PTEAddr = PTBR + (VPN * sizeof(PTE))

  12.     PTE = AccessMemory(PTEAddr)

  13.     if (PTE.Valid == False)

  14.         RaiseException(SEGMENTATION_FAULT)

  15.     else if(CanAccess(PTE.ProtectBits == False))

  16.         RaiseException(PROTECTION_FAULT)

  17.     else

  18.          TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits)

  19.          RetryInstruction()

    위 알고리즘은 크게 아래와 같이 동작한다. 
가상메모리주소에서 VPN을 추출한다 .VPN이 TLB에 존재하는지 TLB를 검사.VPN이 TLB에 있다면 TLB HIT이다. 해당 페이지에 대한 접근 권한 검사까지 성공하면 그 정보와 가상주소의 offset을 합쳐서 원하는 물리메모리주소를 얻을 수 있다.만약 VPN이 TLB에 없다면 TLB MISS이다. TLB MISS가 되면 하드웨어가 페이지테이블에 접근하여 변환정보를 가져오고가상메모리가 유효하고 접근권한검사까지 성공해야 해당 변환 정보를 TLB로 읽어온다. TLB가 갱신되면 명령어를 재실행하게 되며 이 때는 메모리참조가 빠르게 발생한다.

위의 과정을 보면 TLB MISS가 발생된다면, 물리적 메모리에 접근해서  통패 페이지테이블에 접근해서 변환된 정보를 가져오고  이를 가상메모리로 변환한 다음 이 가상메모리가 유효하고 접근권한검사에 문제가 없을 경우 TLB로 해당 정보를 가져 올 수 있다. 이것이 TLB MISS가 가지는 오버헤드다. 이 오버헤드를 TLB FLushing이라고 한다. 

즉, TLB FLushing이란 process간 context switching 시에 발생하는 TLB miss 로 인해 발생하는 오버헤드를 말한다. 이를 방지하기 위해서 우리는 프로세스에 ID를 주어서 TLB 영역을 구분하고, 이를 통해서 필요한 영역만 flush하는 방식으로 flush를 최소화해서 오버헤드를 방지한다. 

하지만 이러한 방식은 의도치 않게 cache에 정보가 남아 있게 되어서, 전혀 다른 페이지 테이블을 가지고 있는 서로 다른 프로세스들 간의 정보를 노출하는 Side Channel이 되기도 한다.