[Computer Architecture] Memory Hierarchy와 Virtual Memory

2024. 3. 19. 23:54CS/Computer Architecture

Locality와 메모리 구조

  • Temporal locality : 내가 한 번 액세스 한 데이터는 조만간 또 액세스 할 가능성이 높은 데이터로, for문에 사용되는 명령어도 여기 속한다.
  • Spatial locality : 메모리에 특정한 곳을 엑세스하면 주변에 액세스 할 가능성이 높은 데이터로 배열이 속한다.

메모리 계층은 모든건 storage에 저장하고 최근에 방문한 데이터를 CPU에 가까운 DRAM(Main Memory)에 캐싱해 놓고 좀 더 최근에 방문한 데이터를 매우 빠른 SRAM에 캐싱해 놓는다. 여기서 Locality 특성이 사용된다.

어떤 데이터를 엑세스하고싶을 때 SRAM에 있다면 히트가 났다고 하고 없어서 lower level까지 가야 한다면 미스가 났다고 한다. 데이터에 액세스 하는 과정은 하이레벨부터 히트가 나는지 찾아보는 과정이다. 미스가 난다면 찾을 때까지 내려가고 찾으면 upper level까지 복사해 온다.


캐시 메모리

CPU와 램 사이에 캐시 메모리가 존재한다. 내가 원하는 데이터가 캐시에 존재하는지 안 하는지 어떻게 알 수 있을까?

 

Direct Mapped Cache

→  0xabab같은 메모리 address를 캐시의 주소로 바꿔서 잘 배치하면 캐시에서 원하는 데이터를 잘 찾을 수 있다. 모듈러 연산을 활용한 해싱처럼 말이다.

 

그런데 캐시에 있는 데이터가 내가 원하는 데이터와 일치하는지 판단할 수 있는 근거가 필요하다. 피지컬한 주소를 캐시의 주소로 바꾸는 과정에서 주소의 일부만 떼오는 방식을 사용하기 때문이다.

 

이 문제 때문에 태그를 사용한다. 10001 메모리주소를 찾는데 10001은 캐시에서 10이 태그, 001이 캐시 주소가 된다.

캐시에 01 태그의 001 주소에 값이 있고 10001 메모리 주소를 찾는 상황을 생각해 보자. 캐시의 주소와 메모리 주소의 001이 일치하므로 태그를 본다. 태그가 기대했던 10과는 다르므로 lower level에서 찾아본다.

 

또, valid bit를 사용해서 해당 데이터가 유효한지 아닌지 기록해 둔다.

 

이 방법의 문제는 다른 캐시가 비어있어도 끝이 같은 메모리끼리 경쟁한다는 것이다. 해싱과 같은 방법으로 해결할 수 있다.


Virtual Memory

Virtual Memory는 메인 메모리를 마치 캐시처럼 사용하는 개념이다. 메인 메모리는 여러 프로그램이 나눠서 사용한다. 사용자는 가상의 address를 이용해서 앱에 접근하고 CPU와 OS는 가상 주소를 피지컬 한 주소로 번역하는 역할을 한다.

 

변수 i를 포인터로 찍어보면 0xababab같은 주소가 나올 테고 이건 가상의 address이다. 이 가상 주소를 실제 메모리 주소로 매핑시키는 건 운영체제의 역할이다. 32비트 컴퓨터라면 가상의 주소가 32비트가 되고, 운영체제는 적절히 나눠서 번역한다.

 

이 과정에서 Page Fault라는 문제가 생긴다. 메모리의 일부는 캐시에 없어서 미스가 날 수 있다. 메인 메모리와 하드디스크 사이에서도 같은 일이 발생할 수 있다. 메인 메모리에 올라오지 않은 데이터는 디스크까지 내려가서 찾아야 하고 이를 Page Fault라 한다.

 

가상 주소를 피지컬 한 주소로 번역해 주는 테이블을 Page table이라 한다. 이 역할을 할 때 TLB라는 하드웨어가 가장 중요하다. TLB는 아주 특별한 캐시 메모리로 페이지 테이블만을 캐싱한다. 페이지 테이블을 일부만 캐싱해서 가지고 있는 역할을 한다.

페이지 테이블 역시 메인 메모리에 존재하는데 메인 메모리에 접근하려고 메인 메모리에 접근하는 건 이상하다. 따라서 TLB가 중요하다.