yeolyi.com성열의 컴퓨터공학

지역성

CPU는 Fetch-Decode-Execute 사이클로 메모리에서 명령어를 하나씩 가져와 처리합니다. CPU 시뮬레이터에서는 메모리 접근이 즉시 이루어지지만, 실제로는 그렇지 않습니다. CPU와 메모리 사이에는 수백 배의 속도 차이가 있어 CPU가 아무리 빨라도 메모리를 기다리는 시간이 병목이 됩니다. 메모리를 빠르게 만들면 용량이 작아지고 용량을 키우면 느려집니다. 빠르면서 큰 메모리는 만들 수 없습니다.

이 문제를 어떻게 해결할 수 있을까요?

책상, 서랍, 창고

일상에서 비슷한 문제를 이미 해결하고 있습니다. 지금 공부하고 있다고 생각해 봅시다. 자주 보는 교과서는 책상 위에 펼쳐 두고, 가끔 참고하는 자료집은 서랍에 넣어 두고, 이번 학기에 안 쓰는 책은 창고에 보관합니다.

왜 이렇게 할까요? 모든 책을 창고에 두면 꺼내러 갈 때마다 시간이 낭비됩니다. 반대로 모든 책을 책상 위에 올려놓을 수는 없습니다. 책상은 공간이 좁기 때문입니다. 그래서 자주 쓰는 것일수록 가까이 두는 전략을 자연스럽게 사용합니다.

컴퓨터에서도 같은 전략을 쓸 수 있지 않을까요? 그런데 “자주 쓰는 데이터”가 정말 있긴 한 걸까요?

지역성

프로그램이 데이터에 접근하는 패턴을 관찰하면 흥미로운 규칙을 발견할 수 있습니다.

시간적 지역성(temporal locality): 한번 접근한 데이터는 곧 다시 접근할 가능성이 높습니다. 반복문에서 같은 변수를 매번 읽고 쓰는 것이 대표적입니다.

메모리 주소
0
1
2
3
4
5
6
7

카운트다운 프로그램처럼 같은 명령어를 반복 실행하면 주소 0~3이 계속 다시 접근됩니다.

공간적 지역성(spatial locality): 접근한 데이터 근처의 데이터도 곧 접근할 가능성이 높습니다. 연속된 데이터를 처음부터 끝까지 순서대로 읽는 경우가 이에 해당합니다.

메모리 주소
0
1
2
3
4
5
6
7

연속된 데이터를 읽을 때 인접한 주소가 차례로 접근됩니다.

프로그램은 전체 메모리를 골고루 쓰지 않습니다. 특정 영역에 집중적으로 접근하는 경향이 있습니다. 그렇다면 자주 쓰는 데이터를 CPU 가까이에 두는 작고 빠른 저장소를 만들면 어떨까요? 다음 글에서 그 저장소, 캐시를 만들어봅시다.