하루에 한 문제

캐시 본문

CS/운영체제

캐시

dkwjdi 2021. 5. 17. 15:39

메모리의 종류

  • 위로 갈수록 가격, 속도는 높아지고 용량은 작아진다.
  • 아래로 갈수록 용량은 커지고 가격, 속도는 낮아진다.

 

 

그렇다면 캐시 메모리가 나온 이유는 뭘까?

 

1.  디스크 입출력 병목현상을 해결하기 위해 주기억장치를 사용

  • 위의 그림과 같이 CPU의 속도는 빠르게 증가했지만 DISK의 속도는 그렇지 못했다.
  • 즉 CPU성능이 높아져도 DISK의 속도는 그렇지 못하기 떄문에 CPU가 제 성능을 낼 수가 없다.

이를 해결하기 위해 DISK보다 용량은 적지만 속도가 빠른 Main memory를 사용하게 되었다.

 

 

 

2. 메인 메모리의 입출력 병목현상 해소

 

  • 하지만 DISK보다 빠른 Main memory를 사용해도 CPU의 속도를 따라잡기에는 한계가 있었다.

메인 메모리의 입출력 병목현상을 해소하기 위해 캐시를 사용한다!

 

 

 

그렇다면 캐시메모리를 통해서 어떻게 병목현상을 해결하는지 작동원리를 살펴보자

캐시의 동작

  • 일반적으로 HW적으로 관리된다.
  • 캐시 히트 : 필요한 데이터 블록이 캐시에 존재
  • 캐시 미스 : 필요한 데이터 블록이 캐시에 존재하지 않음

 

지역성

  • 공간적 지역성 : 참조한 주소와 인접한 주소를 참조하는 특성 (순차적 프로그램 수행, 배열순회)
  • 시간적 지역성 : 한 번 참조한 주소를 곧 다시 참조하는 특성 (for문, 스택)

지역성은 캐시 적중률(cache hit ratio)와 밀접한 관계를 가진다.

 

 

만약 arr[20][20]의 배열을 순회하면서 모든 원소의 합을 구해야 한다고 가정해보자. 이때 2가지 방법이 있다.

int sum1=0;
int sum2=0;
for(int i=0; i<20; i++){
	for(int j=0; j<20; j++){
    	sum1+=arr[i][j]; //1번
        sum2+=arr[j][i]; //2번
    }
}

1번 방법과 2번 방법은 i,j만 바뀌었을 뿐이지만 둘의 성능차이는 어마어마하다.

 

일반적으로 캐시 미스가 나게 되면 메인메모리 -> 캐시로 메모리를 옮길 때 캐시블럭단위로 옮기게 된다.

 

만약 캐시블럭의 크기가 5라고 가정해보자.

 

1번일 경우

  • arr[0][0]은 캐시미스가 일어난다 -> 캐시에 arr[0][0]~arr[0][4]까지 옮긴다.
  • 그렇다면 arr[0][0], arr[0][1], arr[0][2], arr[0][3], arr[0][4] 이 캐시에 올라오게 되고
  • 이를 통해서 메인메모리에 접근하는 시간이 줄어들게 된다!

 

2번일 경우

  • arr[0][0]은 캐시미스가 일어난다 -> 캐시에 arr[0][0]~arr[0][4]까지 옮긴다.
  • arr[1][0]도 마찬가지로 캐시미스가 일어난다 -> 캐시에 arr[1][0]~arr[1][4]까지 옮긴다.
  • arr[2][0]도 위와 마찬가지로 작동한다

이렇게 되면 캐시를 사용하는것이 오히려 더 성능이 좋지 않을 수 있다! (캐시접근시간 + 메인 메모리 접근시간)

 

 

 

 

참고

https://www.youtube.com/watch?v=EdTtGv9w2sA&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN

Comments