본문 바로가기
CS/운영체제

[운영체제] 메모리 계층구조

by 우다다캣 2022. 12. 11.

메모리 계층구조

 컴퓨터에서 말하는 메모리(Memory)컴퓨터의 데이터를 저장하는 기억 장치를 의미합니다. 메모리는 데이터를 영구적으로(전원이 꺼져도 유지되도록) 저장할 수도 있고, 프로그램 사용 시에만 잠깐 저장할 수도 있습니다.

 

 메모리는 컴퓨터에서 사용되는 기억 장치를 통용하는 단어이기도 하지만, 일반적으로는 메인메모리(RAM, Random Access Memory)를 지칭하는 말입니다.

 

 컴퓨터는 메모리를 여러 단계로 구성하여 각 상황에 맞게 사용합니다. 이를 메모리 계층구조라고 하며, 컴퓨터가 효율적으로 데이터를 저장하고 사용할 수 있도록 하여 컴퓨터의 성능을 높여줍니다.

 

 계층구조는 다음과 같습니다.  계층 위로 올라갈수록 가격이 비싸고 속도가 빨라지며 용량은 적어집니다. 

 

 

레지스터(Register)

 레지스터는 CPU 내부에 있는 작은 메모리로, CPU가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치입니다. CPU는 메인 메모리(RAM)에 있는 명령을 읽어와서 실행하는데, 이 때 메모리에서 어떤 주소의 명령을 읽어야 할 지 알고 있어야 합니다. 레지스터는 다음에 실행할 명령어의 메모리 주소를 저장하고 있습니다. 또한 CPU에서 연산한 값을 저장하고, CPU의 현재 상태나 동작을 제어하는 비트를 가지고 있습니다.

 

 컴퓨터 사양을 얘기할 때 32bit, 64bit 이런 얘기를 많이 하는데, 이 때 얘기하는 32bit와 64bit는 레지스터가 한 번에 처리할 수 있는 명령의 비트 수입니다.

 

캐시(Cache)

 캐시는 자주 사용하는 메모리의 데이터를 미리 복사해 둬서 데이터에 더 빠르게 접근할 수 있도록 하는 임시 저장소입니다. 또한, 속도가 빠른 장치와 느린 장치 사이에 중간 속도를 가지고 위치하여 두 기억장치 간의 속도 차이를 줄여 병목 현상을 해결하는 역할도 합니다.

 

 계층 간 속도 차이를 줄이기 위해 계층과 계층 사이에 위치하는 계층을 캐싱 계층이라고 합니다. 예를 들면 CPU와 RAM의 사이에 위치하여 두 계층 간의 속도 차이를 줄여주는 레지스터르 캐싱 계층이라고 할 수 있습니다.

 

지역성(Locality)

 자주 사용되는 데이터를 미리 저장해두는 캐싱이 효율적으로 동작하려면 캐시에 저장될 데이터가 지역성을 가져야 합니다. 지역성이란 데이터 접근이 시간적, 공간적으로 가깝게 일어나는 것을 의미합니다.

 

시간 지역성

 시간 지역성은 특정 데이터에 한 번 접근한 경우 가까운 미래에 같은 데이터에 다시 접근할 가능성이 높은 특성을 의미합니다. 예를 들어 메모리 상의 같은 주소에 여러 번 읽기, 쓰기를 반복한다면 이 데이터를 캐싱했을 때 높은 효율을 얻을 수 있습니다.

 

공간 지역성

 공간 지역성은 특정 주소의 데이터에 접근한 경우 그 주소와 인접한 주소의 데이터에 접근할 가능성이 높은 특성을 의미합니다. 예를 들어, 메모리 주소에 접근할 때 해당 주소뿐만 아니라 주소가 존재하는 블럭 전체를 전부 캐시에 가져옵니다. 이 때 메모리 주소에 오름차순이나 내림차순으로 순차적으로 접근한다면 캐시에 저장된 같은 블록 내의 인접한 주소의 데이터에 접근하게 되므로 캐싱 효율성이 향상됩니다.

 

캐시 히트, 캐시 미스 (Cache Hit, Cache Miss)
 캐시에서 원하는 데이터(현재 접근하려는 데이터)를 찾았다면 이를 캐시 히트라고 하고, 데이터가 캐시에 없다면 캐시 미스라고 합니다.
 CPU를 예시로 들면 캐시 히트인 경우 CPU 내부의 캐시에서 데이터를 가져오기 때문에 위치도 가깝고 CPU 내부 버스 기반으로 작동하기 때문에 속도도 빠릅니다. 그러나 캐시 미스인 경우는 메인 메모리에서 데이터를 가져와야 하기 때문에 위치도 멀고 시스템 버스를 기반으로 작동하기 때문에 속도도 느립니다.

 

캐시 매핑(Cache Mapping)

 CPU의 레지스터는 용량이 굉장히 작은 반면, 메인 메모리(RAM)의 용량은 레지스터에 비해 굉장히 큽니다. 따라서 레지스터가 메인 메모리의 데이터를 효율적으로 캐싱하여 캐시 히트 비율을 높이려면 데이터를 레지스터의 공간에 어떻게 가져올지가 매우 중요합니다.

 

 데이터를 캐시에 매핑하는 방법은 3가지가 있습니다.

 

직접 매핑(Direct Mapping)

 메인메모리와 캐시의 공간을 각각 똑같은 크기로 나눈 뒤 순서대로 매핑하는 방식입니다. 예를 들어서 메인메모리의 크기가 100, 캐시의 크기가 10이라고 하면 메인메모리의 1~10 공간의 데이터를 캐시 1에 위치하도록 하고 11~20 공간의 데이터를 캐시 2에 위치하도록 하는 방식입니다.

 

 직접 매핑은 구현이 간단하고 처리가 빠르지만 캐시 미스가 발생할 확률이 높습니다. 예를 들어서 메모리의 31~40에 해당하는 데이터를 자주 사용한다고 하면 캐시 3에 바로 접근하면 되지만, 캐시 3에는 한 개의 데이터만 저장할 수 있기 때문에 32, 33, 34... 와 같이 부를 때마다 매번 캐시 교체가 일어나게 됩니다. 또한, 메모리의 1~10에 해당하는 데이터를 거의 사용하지 않는다고 해도 캐시 1에 다른 데이터를 저장할 수 없어서 캐시 공간이 낭비될 수 있습니다.

 

연관 매핑(Associative Mapping)

 메인메모리와 캐시 공간의 순서를 일치시키지 않고, 자주 사용하는 메모리값을 캐시 어디에나 저장할 수 있는 방식입니다. 예를 들어서 메인메모리의 33, 56, 89 주소의 데이터를 자주 사용한다며 캐시의 1, 2, 3 공간에 33, 56, 89를 각각 매핑할 수 있습니다.

 

 직접 매핑과는 달리 데이터가 캐시의 어느 공간에 저장되어 있을지 모르기 때문에 매 번 캐시의 모든 블록을 탐색해야 한다는 단점이 있습니다. 그러나 정말 자주 사용되는 데이터들이 캐싱되어 있기 때문에 캐시 적중률이 높습니다.

 

집합 연관 매핑(Set Associative Mapping)

 집합 연관 매핑은 직접 매핑과 연관 매핑을 합친 방식입니다. 메모리와 캐시 공간의 순서를 일치시키되, 블록을 더 큰 단위로 나눠서 해당 단위 안에서는 데이터가 무작위로 매핑될 수 있도록 하는 방식입니다.

 

 예를 들어서 메모리 크기가 100, 캐시 크기가 10이라면 캐시 1~5에는 메모리 1~50 공간의 데이터를 무작위로 저장할 수 있습니다. 이와 같은 방식으로 캐싱을 하면 캐싱 공간에 대한 제약이 크지 않아서 캐시 히트 확률도 높고, 어느 정도 블록화가 되어 있기 때문에 탐색 속도도 연관 매핑에 비해 더 빨라집니다.

 

참고자료

http://itnovice1.blogspot.com/2019/08/blog-post_99.html

https://jihyeong-ji99hy99.tistory.com/5

https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C

https://gguljaem.tistory.com/entry/%EC%BA%90%EC%8B%9C%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%A7%A4%ED%95%91%EA%B8%B0%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%9C-%EC%84%A4%EB%AA%85