지역성이란?
지역성은 데이터나 명령어를 읽어오는 방식이 특정 지역 영역에 집중되는 현상으로 특성에 따라 가까운 데이터를 참조하려는 경향을 의미한다.
지역성은 메모리나 캐시시스템의 성능을 향상시키는 데 중요한 역할을 가지고 있으며 메모리나 캐시 시스템은 이런 지역성을 활용해 데이터나 명령어를 미리 불러오거나 저장함으로써 연결 지연을 줄이고 전체 시스템의 성능을 향상시키는 최적화에 중요한 역할을 맡고 있다.
특성에 따라 시간적 지역성, 공간적 지역성으로 나뉜다.
시간적 지역성
- 시간적 지연성은 한 번 액세스한 데이터나 명령어가 다시 액세스 될 가능성이 높은 현상을 말하며, 반복적인 액세스 패턴이나 같은 데이터나 명령어가 다시 사용될 때 나타난다.
- 루프 내 동일한 변수나 연산이 반복적으로 사용되는 경우
공간적 지역성
- 데이터나 명령어의 액세스 패턴이 특정 지역 영역에 집중되는 현상을 말함, 인접한 데이터나 명령어에 대한 액세스가 빈번할 때 나타남
- 배열이나 리스트와 같은 연속된 데이터 구조에서 인접한 요소들에 대한 액세스가 빈번할 경우
활용 사례
- 루프 레벨 병렬성 : 루프의 반복이 시간적 지역성을 보이는 경우, 루프를 병렬로 실행해 여러 코어를 활용 가능, 다수의 반복이 동시에 실행될 수 있기 때문에 다중 코어 프로세서를 활용해 성능을 향상시켜줌
- 데이터 캐싱 : 메모리에서 데이터를 캐시로 읽어올 때, 공간적 지역성을 고려하여 인접한 메모리 위치에 있는 데이터를 함께 캐시에 가져와 캐시 히트율을 높일 수 있음
- 프리패치 : 메모리에서 데이터를 미리 가져오는 프리패치를 사용할 때도 지역성을 고려해 인접한 메모리 위치의 데이터를 함께 가져와 메모리 액세스 지연을 줄일 수 있음
- 캐시 블록화 : 캐시 메모리의 블록 크기를 고려해 인접한 데이터들을 함께 캐시에 로드해 메모리 액세스를 효율적으로 활용
- 메모리 할당 및 배치 : 메모리 할당 시 공간적 지역성을 고려해 인접한 데이터들을 함께 할당하고 배치해 메모리 프래그먼테이션을 줄이고 캐시 효율성을 높일 수 있음.
여기서 말하는 캐시cache
란 데이터나 값을 미리 복사해 놓는 임시 장소를 말한다. 캐싱은 캐시를 사용하는 것
캐시 히트율은 캐시된 데이터를 요청할 때 해당 값이 메모리에 존재하여 얼만큼의 비율로 잘 찾았는지에 대한 여부를 말한다. 히트율이 낮다면 데이터를 제대로 찾지 못하고 있다는 뜻이며 디스크에서 데이터를 불러오는 비율이 높다는 말로 성능에 영향을 끼칠 수 있음
메모리 프래그먼테이션은 메모리 단편화라 하며 사용 가능한 메모리가 존재하지만 할당(사용)이 불가능한 상태를 말하며 메모리 공간이 낭비된다는 의미
게임에서의 사례
- 타일 기반 맵 : 특정 타일 데이터를 로드하고 해당 타일 주변 데이터까지 로드
- 적재 시스템 : 플레이어의 주변 지역 리소르를 로드하고 해제하여 필요한 시기에 필요한 데이터만 로드해 최적화
- 애니메이션 : 특정 애니메이션 데이터를 캐싱해 재사용
- 사운드 캐시 : 특정 사운드를 반복적으로 재생될 수 있어 사운드 데이터를 캐싱하여 사용
- 씬 관리 : 씬을 빈번하게 이동시키는 경우 해당 씬의 메모리를 유지하는 것이 유용할 수 있음
정리
앞서 정리한 내용 중 이중 반복문이 더 느린 이유에 대해 정리하다 지역성이란 것을 알게되었다. 최적화를 위해 다양한 곳에서 사용하는 중요한 개념으로 생각해 정리했다.
현재 만들고 있는 개인 프로젝트에도 중요한 역할을 할것 처럼 보이며 코드를 작성할 때 지역성이라는 개념을 고려해야겠다 생각했다.
추가로 이번 자료를 정리하면서 메모리 단편화, 블록에 대해 새로 알게 되었는데 따로 추가로 정리해야겠다.