하루에 한 문제
캐시 본문
메모리의 종류
- 위로 갈수록 가격, 속도는 높아지고 용량은 작아진다.
- 아래로 갈수록 용량은 커지고 가격, 속도는 낮아진다.
그렇다면 캐시 메모리가 나온 이유는 뭘까?
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
'CS > 운영체제' 카테고리의 다른 글
스케줄러 (scheduler) + Job,Ready,Device Queue란? (0) | 2021.05.18 |
---|---|
멀티 프로세스와 멀티 스레드 (0) | 2021.05.18 |
프로세스 간 통신 (IPC, Inter Process Communication) (0) | 2021.05.18 |
Thread(쓰레드)란? (0) | 2021.05.17 |
프로세스 (0) | 2021.05.17 |
Comments