Cache and Virtual Memory

클라이언트는 서버와 통신을 해서 데이터를 가져옵니다. 같은 작업을 반복하는데 통신에 걸리는 시간이 길고 데이터의 용량이 크다면 비효율적일 것입니다.
한번 불러온 데이터는 저장하여 비효율적인 작업을 반복하지 않도록 도와주는 것이 캐시입니다.
부스트캠프 챌린지에서 다룬 캐시는 위의 내용과 같습니다만, 추가적으로 가상메모리를 더해 내용을 정리해 보았습니다.

Cache

캐시는 데이터나 값을 미리 복사해 놓는 임시 장소입니다. 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우 사용합니다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있습니다.
캐시 메모리는 속도가 빠른 장치와 느린 장치 사이에서 속도 차에 따른 병목 현상을 줄이기 위한 범용 메모리입니다.

  • CPU 캐시 대용량의 메인 메모리 접근을 빠르게 하기 위해 CPU 칩 내부나 바로 옆에 탑재하는 작은 메모리입니다. 메모리 접근 속도가 늘어나는 것에 비해 CPU의 처리 속도가 훨씬 빠르게 늘어나고 있기 때문에, 용량은 작지만 속도가 빠른 CPU 캐시는 현재 마이크로프로세서의 성능에 직접적인 영향을 미칩니다.
    CPU Cache
  • 디스크 캐시 디스크 버퍼라고도 하며, 1980년대 후반 이후 판매되는 대부분의 하드 디스크는 디스크 제어와 외부와의 인터페이스를 위해 작은 컴퓨터를 내장하고 있습니다. 이 작은 컴퓨터는 대개 디스크에 입출력되는 데이터를 저장하는 작은 메모리를 갖고 있는데, 이를 디스크 캐시라고 합니다. 디스크 캐시는 미리 읽기, 속도 조절, 쓰기 가속, 명령 큐 등의 용도로 사용합니다.
  • 기타 캐시 CPU 캐시는 하드웨어를 통해 관리되고, 그 밖의 다른 캐시들은 소프트웨어적으로 관리됩니다. 운영체제의 메인 메모리를 하드 디스크에 복사해 놓는 페이지 캐시는 운영체제 커널과 파일 시스템을 통해 관리되고, BIND DNS 데몬은 도메인 이름과 IP 주소 사이의 매핑을 저장해 둡니다.
    신뢰성이 적은 네트워크에서, 네트워크 사이에 주고 받는 데이터를 캐시해 놓는 것은 매우 흔한 일이라고 합니다. 웹 브라우저는 최근 방문한 사이트를 캐시에 저장해 놓습니다. 많은 인터넷 제공업체들과 대규모 네트워크의 운영자들은 인기 있는 웹 페이지의 캐시를 프록시 서버에 저장하여 웹 페이지 요청에 응답하게 함으로써 네트워크 대역폭을 아낀다고 하네요.

지역성

캐시가 효율적으로 동작하려면, 캐시에 저장할 데이터가 지역성을 가져야 합니다. 지역성이란 데이터 접근이 시간적, 공간적으로 가깝게 일어나는 것을 의미합니다.

  • 시간적 지역성 특정 데이터가 한번 접근되었을 경우, 가까운 미래에 또 한번 데이터에 접근할 가능성이 높은 것을 시간적 지역성이라고 합니다.
    메모리 상의 같은 주소에 여러 차례 읽기 쓰기를 수행할 경우 상대적으로 작은 크기의 캐시를 사용해도 효율성을 꾀할 수 있습니다.
  • 공간적 지역성 특정 데이터와 가까운 주소가 순서대로 접근되었을 경우를 공간적 지역성이라고 합니다. CPU 캐시나 디스크 캐시의 경우 한 메모리 주소에 접근할 때 그 주소뿐 아니라 해당 블록을 전부 캐시에 가져옵니다. 이때 메모리 주소를 오름차순이나 내림차순으로 접근한다면, 캐시에 이미 저장된 같은 블록의 데이터를 접근하게 되므로 캐시의 효율성이 크게 향상됩니다.

가상 메모리

메모리는 프로그램과 프로그램 수행에 필요한 데이터 및 코드를 저장하는 장치입니다. - 주기억장치 : 내부 기억장치로 DRAM, CPU 내부의 레지스터와 캐시 등이 해당됩니다. - 보조기억장치 : 외부 기억장치로 SSD, HDD 등이 해당됩니다.
초창기 컴퓨터에서는 사용 가능한 RAM의 용량이 ‘가장 큰 실행 애플리케이션의 주소 공간’보다 커야 했습니다. 그렇지 않을 경우 ‘메모리 부족’ 오류로 인해 해당 애플리케이션을 실행할 수 없었습니다.
이후 컴퓨터에서는 프로그래머가 애플리케이션의 일부분만 기억장치에 올려 실행하도록 지정할 수 있게 하는 오버레이 기법을 사용하여 메모리 부족 문제를 해결하고자 했으나, 애초에 시스템이 프로그램을 위한 충분한 메모리를 갖추고 있지 않은 경우에는 해결하지 못했습니다.
가상 메모리 기법은 애플리케이션을 실행하는 데 얼마나 많은 메모리가 필요한지 집중하는 것이 아닌, 애플리케이션을 실행하는 데 최소한 얼마만큼의 메모리가 필요한가에 집중하여 문제를 해결하고자 합니다. 메모리 접근은 순차적이고 지역화되어 있습니다. 애플리케이션의 일부분은 메모리에 올라가고, 메모리에 올라가지 않는 나머지는 디스크(보조 기억장치)에 위치해야 합니다.

가상 메모리(Virtual Memory)는 메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에 착안하여 만들어졌습니다. 애플리케이션이 실행될 때, 실행에 필요한 일부분만 메모리에 올라가며 나머지는 디스크에 남게 됩니다. 즉, 디스크가 RAM의 보조 기억장치처럼 작동하는 것입니다. 다시 말하면, 빠르고 작은 기억장치 RAM을 크고 느린 기억장치 disk와 병합하여 하나의 크고 빠른 기억장치(Virtual Memory)처럼 동작하게 하는 것입니다.

가상 메모리를 구현하기 위해서는 컴퓨터가 특수 메모리 관리 하드웨어를 갖추고 있어야 하는데, 이를 MMU(Memory Management Unit)라고 합니다. MMU는 가상 주소를 물리적 주소로 변환하고, 메모리를 보호하는 기능을 합니다. CPU가 각 메모리에 접근하기 이전에 메모리 주소 번역 작업이 수행됩니다. 이때 메모리를 일일히 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지기 때문에 MMU는 RAM을 여러 페이지로 나누어 각 페이지를 하나의 독립된 항목으로 처리합니다. 이 ‘페이지 및 주소 번역 정보를 기억하는 작업’이 가상 메모리를 구현하는 데 있어 결정적인 절차입니다.

Page Fault

페이지 폴트란 어떤 페이지에 접근하려고 했을 때 해당 페이지가 실제 물리 메모리에 없는 경우 발생하는 인터럽트이며, 페이지 폴트가 발생하면 운영체제가 이를 해결한 뒤 다시 동일한 명령을 수행합니다. 페이지 폴트가 자주 일어나게 되면 운영체제의 성능이 많이 저하되기 때문에, 페이지 폴트가 최소한으로 일어나도록 페이지 교체 정책을 적용합니다. 이는 어떤 페이지를 제거하고 새 페이지를 저장하면 좋을지 결정하는 알고리즘입니다. 자세한 내용은 프로세스 스케줄링 알고리즘과 유사하기 때문에 추후 프로세스 관련 글에서 서술하도록 하겠습니다.

TLB(Translation Lookaside Buffer)

페이지 정보 캐시인 TLB는 가상 메모리 주소를 물리적 주소로 변환하는 속도를 높이기 위해 사용하는 캐시로, 최근에 일어난 가상 메모리와 물리적 주소의 변환 테이블을 저장합니다.
CPU가 가상 주소를 가지고 메모리에 접근하기 전 TLB에 먼저 접근하여 가상 주소에 해당하는 물리적 주소를 찾고, 만약 TLB에 매핑이 존재하지 않는다면 MMU가 페이지 테이블에서 해당되는 물리적 주소로 변환한 후 메모리에 접근합니다.

참고