티스토리 뷰

컴퓨터에는 CPU에 레지스터, 캐시 와 메인메모리 (RAM) 그리고 하드디스크 등 다양한 메모리가 있습니다.






 위 그림에서 볼 수 있듯이 메모리 계층 구조에서 위로 올라갈수록 속도는 빠르지만, 용량은 적어지고 아래로 내려올수록 속도는 느려지지만, 용량은 커지는 것을 알 수 있습니다.

 CPU의 ALU가 요구하는 데이터가 만약 하드디스크에 있다면 데이터를 가져오기 위해서는 L1 캐시부터 하드디스크까지 모든 계층을 거쳐야 하고 다시 하드디스크에서 L1 캐시까지 거쳐서 데이터를 가져오게 됩니다.

 그럼 CPU에서 바로 하드디스크에 접근해서 데이터를 가져오면 더 빠를 텐데 왜 위와 같이 계층 구조를 모두 통해서 가져오는지에 대해 의문이 들 것 입니다.


 만약에 프로그램 실행이 산발적이라면 메모리 계층구조를 통하는 것이 부담스러울 것이지만 프로그램의 실행은 "지역적 특성"을 띄고 있기 때문에 계층적으로 메모리를 두었을 때 더 성능이 좋아진다는 것 입니다.

 CPU 안에는 레지스터 이외 에도 L1 캐시 L2 캐시 등이 있는데 이러한 캐시가 없던 시절에는 데이터를 메모리에서 레지스터로 바로 가져왔었습니다. 레지스터에서 CPU로 데이터를 가져올 때는 1 사이클이 걸리는 데에 반해 메인 메모리에서부터는 100 사이클 정도가 걸린다고 보면 CPU의 데이터 요청 속도가 빨라지면서 이 시간이 매우 부담스러워지게 된 것 입니다.


 아무리 CPU 성능이 좋아서 연산 속도가 빨라진다 해도 연산에 필요한 데이터가 메인메모리에서 레지스터로 옮겨지기까지 기다려야 하기 때문입니다. 그래서 생기게 된 것이 바로 캐시메모리 입니다. 캐시메모리는 CPU에 레지스터와 메인메모리 사이에 위치하고 있습니다.


 이제 CPU가 데이터를 요청하면 메인 메모리에서 해당 데이터만 가져오는 게 아니고 근접한 데이터들과 함께 블록 단위로 캐시로 가져오게 되고 그다음 캐시에서 해당 데이터만 레지스터에 전달하게 됩니다. 그러면 다음에 CPU가 데이터를 요청할 경우 바로 메인 메모리에서 데이터를 가져오는 것이 아니라 일단 캐시에 데이터가 있는지 요청을 하게 되고 만약 있다면 캐시에서 바로 해당 데이터를 가져오게 됩니다. 이것을 "캐시 히트"라고 하며 만약 캐시에 데이터가 없어서 다시 메인메모리에 데이터를 요청하게 되는 것을 "캐시 미스" 라고 합니다.


 캐시에서 데이터를 가져오는 게 훨씬 빠르기 때문에 "캐시 히트"가 많이 일어 날수록 좋다는 것은 알 수 있지만, 프로그램이 실행되면서 필요한 데이터가 모여있을 확률이 얼마나 높을까요?


 그전에 먼저 프로그램의 "지역적 특성"에 대해서 알아야 하는데 프로그램의 지역성 특성에는 에는 두 가지가 있는데 Temporal Locality와 Spatial Locality 가 있습니다. Temporal Locality(반복접근)는 특정 데이터에 한번 접근했을 때 또다시 접근한 확률이 높다는 것이고 Spatial Locality (주변 접근) 는 이번에 접근할 데이터가 이전에 접근했던 데이터의 근처에 있을 확률이 높다는 것 입니다.


예1)

int[] arr = [1,2,3,4,5]


int sum = 0;


for( int i = 0; i < arr.length; i++)

{

 sum += arr[i];

}


 예1) 에서 sum이라는 변수는 배열 arr의 값을 하나씩 가져와서 더할 때마다 접근하게 되면서 Temporal Locality의 특성을 가지고 배열의 값을 가져오는 arr[i]는 Spatial Locality의 특성이 있습니다.



예2)


int sum = 0;


for( int i = 0; i < 10; i++)

{

   for( int j = 0; j < 10; j++)

   {

     sum += arr [j] [i];

   }

}


 예2) 같은 경우에는 sum이라는 변수는 예1)과 같이 Temporal Locality의 특성을 가지지만  arr [j] [i] 와 같은 경우 배열에 순차적으로 메모리에 접근하지 않기때문에 Spatial Locality 특성이 결여되어 있다고 볼 수 있습니다.


 캐시 히트가 잘 일어나도록 지역성을 코려하여 작성한 코드를 캐시 프렌들리 코드라고 하는데 예1) 에서의 코드를 보더라도 지역성을 특별히 의식하지 않아도 지금까지 우리가 만들어 왔던 코드들도 지역성이 적용되고 있다고 볼 수 있겠습니다.

실제로 캐시에 데이터가 존재할 확률은 90% 그 이상이라고 하니 캐시의 사용 이유가 충분하다고 볼 수 있습니다.















'프로그래밍' 카테고리의 다른 글

메모리 구조  (0) 2018.11.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함