메모리 계층구조, Cache Memory 의 작동 방식

2021. 7. 2. 23:07운영체제

메모리는 다음과 같은 계층 구조를 가진다.

 

레지스터 

캐시

주기억장치 (DRAM)

보조기억장치 (HDD/SSD)

 

위로 갈 수록 속도가 빠르고, 용량이 작다!

 

우리의 작업을 수행하는 프로세서는 보조기억장치, 즉 디스크에 있는 파일에 직접 접근할 수 없다.

프로세서가 연산을 수행하는 프로그램과 데이터는 메인 메모리 상에 있어야 한다.

 

디스크에 있는 작업을 메인 메모리 상에 올리고, 메인 메모리에서 가져와서 연산을 하는 것이다!

왜 직접 접근하지 않고 중간 단계를 거치는 것일까?

 

이유는 바로 속도의 차이에 있다.

프로세서, 주기억장치, 보조기억장치의 속도 차이

 

디스크와 프로세서가 작업을 처리할 수 있는 속도에 현저한 차이가 있기 때문에,

이로 인한 디스크 입출력 병목현상을 해결하기 위해, 중간에 메인 메모리를 두고 이용하는 것!

 

캐시는 프로세서 내부에 있는 메모리이다.

캐시도 비슷한 이유로 존재한다.

위 그림과 같은 메인 메모리와 CPU 사이의 속도 차이를 줄이기 위해,

사이에서 임시로 값을 저장해준다.

 

캐시의 작동 방식은 다음과 같다.

프로세서가 캐시에 필요한 데이터 블록이 있는지 확인하고, 있으면 캐시에서 가져와서 쓴다. 

없으면 메인 메모리에서 필요한 데이터를 캐시로 올리고, 사용한다. 

이를 각 Cache Hit , Cache Miss 라고 한다!

 

이런 생각을 해 볼 수 있다.

Cache Hit 이 계속 일어날 것이라는 보장이 없다.

Cahce Miss 가 계속 일어난다면, 어차피 메인 메모리에서 새로 가져와야 할 것을

굳이 캐시를 한 번 확인하고 메인 메모리로 가는 것이 비효율적이지 않을까?

또, 캐시는 kb 단위의 매우 작은 용량을 가진다. 과연 그 용량으로 효율을 낼 수 있을까?

이렇게 두 단계를 거치는 것이, 병목현상을 해결할 수 있는 원리가 뭘까?

 

이는 바로 "지역성" 이라는 특징 때문!

 

1. 공간적 지역성

프로그램을 실행하다보면, 데이터를 참조한 주소와 근처에 있는 주소를 또 참조할 가능성이 높다는 것이다.

따라서, 근처에 있는 데이터를 통으로 가져오면?

다음에 참조할 메모리를 미리 캐시에 올려두었으니 Cache Hit 이 발생한다.

 

2. 시간적 지역성

한번 참조한 메모리를, 다시 참조할 가능성이 높다는 것이다. 쉬운 예시로, for문을 생각해보자.

 

이러한 지역성 때문에, Cache hit ratio가 높아지게 되는 것이다.

공간적 지역성을 이용하기 위해,

캐시는 메모리에서 데이터를 읽어올때 인접한 데이터를 주변까지 블록단위로 가져와야 할 것이다.

이를 Cache Line 혹은 Cache Block 이라고 한다!

 

Cache 는 하드웨어적으로 관리가 되는데, 이런 것을 알아야 할 이유가 있나 싶을지도 모른다.

다음의 프로그램을 살펴보자

#define S 20000

int map[S][S];

int main()
{
	int x = 0;

	for (int i = 0; i < S; i++)
		for (int j = 0; j < S; j++)
			x += map[i][j];
            // x += map[j][i];
}

20000 * 20000 의 이차원 배열을 순회하는 반복문이다.

[i][j] 로 참조하는 것과, [j][i] 로 참조하는 것의 차이를 보고자 한다.

연산 수가 같은데도, 꽤 많은 시간 차이가 날 것이다!

 

[ o o o o o o o o o ]

[ o                           ]

[ o                           ]

[ o                           ]

 

이유는 바로 Cache  때문이다.

위와 같은 데이터를 가로부터 순회할 경우,

Cache line 으로 읽어온 순서와 일치하여 Cache Hit가 계속 발생하게 되어 빠르게 작업이 처리되고,

 

세로부터 순회할 경우, 한글자를 읽고 또 다음 줄로 넘어가버리기 때문에,

Cache를 이용하지 못하고 메인 메모리에서 계속 새로 읽어와야하기 때문이다!

'운영체제' 카테고리의 다른 글

Kernel Thread, User Thread  (0) 2021.07.08
Thread 의 개념  (0) 2021.07.07
Interrupt 와 Context Switching  (0) 2021.07.05
Process state, 프로세스의 상태  (0) 2021.07.03
PCB (Process Control Block) 이란?  (0) 2021.07.02