Chapter 06 메모리와 캐시 메모리 - goorm-6th-Als/for_study_Algorithm GitHub Wiki
-> DRAM, SRAM, SDRAM, DDR, SDRAM 등 다양한 형태의 저장소가 존재한다.
- RAM? : 실행할 프로그램의 명령어와 데이터가 저장되어 있는 메모리, 전원을 끄면 데이터가 사라지므로 휘발성 저장 장치 라고한다.
- ROM? : RAM과 대비되는 특징으로 전원이 꺼져도 내용이 유지되는 저장 장치를 비 휘발성 저장 장치라고 한다. 하드나 SSD, USB가 여기 해당한다.
그렇다면 사라지지 않는 ROM이 더 사용하기 편한게 아닐까요?
CPU는 보조기억장치에 직접적인 접근이 불가합니다. 따라서 ROM에는 보관할 데이터를 저장하고, RAM에 실행할 대상을 저장하여 나눠서 동작합니다.
'Word' 라는 프로그램을 실행하고 싶다면, SSD에 Word를 설치하고, 실행하고 싶을때 RAM에 복사하여 실행하는 방식입니다.
동시에 많은 프로그램을 실행할 수 있게 되는것인데 예시를 들자면 RAM은 책상의 크기 입니다.
우리는 책을 읽기 위해서 책장에서 책을 책상으로 가져옵니다.
책상이 크다면 번거롭게 왔다갔다 할 필요없이 제가 읽고싶던 책들 여러권을 한번에 가져와서 읽을 수 있겠죠.
-
DRAM : Dynamic Ram의 줄임말로 우리가 일반적으로 사용하는 메모리입니다.
말 그대로 '동적'. 저장된 데이터가 동적으로 변하는 RAM입니다.
즉 시간이 지남에 따라 점차 사라지는 RAM이므로 데이터가 소실되기 전 주기적으로 다시 저장해야합니다.
번거로움에도 저희가 주로 사용되는 이유는 전력이 낮고, 저렴하며, 집적도가 높아 대용량으로 설계하기 좋기 때문입니다. -
SRAM : Static Ram의 줄임말로 속도가 빨라야하는 캐시 메모리에 주로 사용됩니다.
정적 메모리이므로 내용이 소실되지 않습니다. 일반적으로 속도도 DRAM보다 빠릅니다.
DRAM에 비해 전력소모가 크고, 집적도가 낮으며 비용이 높습니다. -
SDRAM: 클럭 신호와 동기화된 DRAM입니다.
클럭에 맞추어 동작하며 클럭마다 CPU와 정보를 주고 받을 수 있습니다. -
DDR SDRAM : 최근에 가장 많이 사용되는 RAM으로 대역폭을 넓혀 속도를 빠르게 만든 SDRAM 입니다.
여기서 대역폭은 고속도로의 차선을 생각하면 좋습니다. 기존에 도로가 2차선이었다면 너비가 2배가된 4차선이 되었다 생각하면 됩니다.
전송 속도가 두배가량 빠르며, 한 클럭당 한 데이터를 주고받을 수 있다면 SDR SDRAM 이라고 칭합니다.
주소를 두가지로 나눌 수 있는데 물리 주소와 논리 주소로 나눌 수 있습니다.
물리 주소는 메모리 하드웨어가 사용하고, 논리 주소는 CPU와 실행중인 프로그램이 사용하는 주소입니다.
논리 주소(logical address) | CPU가 생성하는 주소입니다. 가상 주소(virtual address)라고도 하며, 논리 주소나 가상 주소나 같은 뜻으로 사용합니다. |
---|---|
물리 주소(physical address) | 메모리가 취급하게 되는 주소[메모리 주소 레지스터(MAR)에 주어지는 주소]입니다. |
- 우리는 컴퓨터에 저장된 정보의 위치를 주소로 나타낼 수 있다고 이해하고 있습니다.
그렇다면 CPU와 실행 프로그램은 현재 몇번째 메모리에 무엇이 있는지 알 수 있을까요?
사실 이 친구들은 서로의 위치를 알 필요가 없습니다. 매번 다른 위치에 저장되기도 하며, 시시각각 정보들이 변하기 때문입니다.
논리 주소는 결국 프로그램이 생성하는 주소이며, 이 주소와 일치하는 프로그램의 위치가 물리 주소입니다.
다만 논리주소는 0번지부터 실행하는데 실제 물리주소는 0번지에 여러 프로그램이 존재할 수 없습니다.
가상 주소로는 얼마든지 가능하지만 하드웨어에는 0번지가 하나인데 어떻게 처리할까요?
이 과정에서 CPU가 개입하여 프로그램이 실행될때 논리주소를 물리주소를 바꿔주어야 하는데 이때 MMU -> 메모리 관리 유닛이 동작합니다.
MMU 안에는 '재배치 레지스터'가 존재하는데 이 값을 논리주소와 더해 새로운 값을 메모리에 액세스하게 됩니다.
예를 들어 프로세스가 3400번지고, 재배치 레지스터가(베이스 레지스터) 15000이라면 메모리에는 18400이라는 주소가 들어갑니다.
베이스 레지스터는 결국 실행중인 프로그램의 가장 작은 물리주소를 저장합니다.
하지만 위 같은 방식이면 불안정한 명령이 실행될 수도 있습니다.
이미지와 같이 프로그램의 논리 주소 영역을 벗어난다면 한계 레지스터로 관리하게 됩니다.
베이스 레지스터가 주소의 가장 작은 값이라면, 한계 레지스터는 최대값입니다.
범위를 정하게 되어 프로그램을 나누고, 만약 범위를 벗어난다면 인터럽트(트랩)을 발생시켜 중단합니다.
저장 장치는 대부분 아래와 같은 명제를 따른다.
- CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.
- 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다.
- CPU 내의 레지스터, 메모리(RAM), USB를 비교하자면 CPU와 가장 가까운 레지스터는 일반적으로 RAM보다 용량은 작지만, 접근 시간이 압도적으로 빠르고 비싸다.
- 그리고 USB 메모리보다 CPU에 더 가까운 RAM은 접근 시간이 훨씬 더 빠르지만, 같은 용량이면 당연히 더 빠른 RAM이 더 비싸다.
- 컴퓨터가 사용하는 저장 장치들은 CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼 수 있다. 이를 저장 장치 계층 구조라고 한다.
지금까지 알아본 저장 장치 계층은 아래와 같다.
- CPU가 좋아질수록 CPU의 연산속도는 빨리지고 때문에 CPU는 연산을 이미 다 끝냈지만 메모리에 접근하는 시간이 더 걸리는 현상이 발생한다.
그래서 등장한 저장 장치가 캐시 메모리다.
- 캐시 메모리는 CPU와 메모리 사이에 위치하고, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장 장치이다.
캐시 메모리를 물건을 사러 가는 거스로 비유하면 다음과 같다.
-
우리가 사용하는 컴퓨터 내부에는 여러 개의 캐시 메모리가 있다.
-
이 캐시 메모리들은 CPU와 가까운 순서대로 계층을 구성한다.
- 코어와 가장 가까운 캐시 메모리는 L1(Level1)캐시 -> L2캐시 -> L3캐시
일반적으로 L1 캐시와 L2 캐시는 코어 내부에 위치해 있다
- 캐시 메모리의 용량
L1 < L2 < L3
- 캐시 메모리의 속도
L1 > L2 > L3
아래는 캐시까지 포함한 저장 장치 계층 구조 이다.
캐시 메모리는 용량이 작고 당연하게도 모든 내용을 저장할 수는 없다. 그렇다면 무엇을 저장해야할까?
- 캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장하고 예측에 성공하여 캐시 메모리 내 데이터가 CPU에서 활용될 경우를 **캐시 히트(cache hit)**라고 한다.
- 틀렸다면 캐시 미스(cache miss)
- 그리고 캐시가 히트되는 비율은 캐시 적중률(cache hit ratio)이라 하고 계산 방법은 다음과 같다
캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)
우리가 사용하는 캐시 적중률은 대락 85~95 이상 이라고 한다.
- 캐시 메모리는 참조 지역성의 원리로 메모리에서 가져올 데이터를 결정하고 참조 지역성의 원리는 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리이다.
- CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다.
변수에 값을 저장하고 나면 언제든 변수에 다시 접근하여 저장된 값을 사용할 수 있고 이는 달리 말해 CPU는 변수가 저장된 메모리 공간을 언제든 다시 참조할 수 있다는 것을 의미한다.
위 코드에서 변수는 num과 i고 구구단 2단을 출력하는 과정에서 이 변수들은 여러 번 사용되고 있고 이렇게 최근에 접근했던 메모리 공간에 다시 접근하려는 경향을 시간 지역성 이라고 한다.
-
CPU가 실행하려는 프로그램은 보통 관련 데이터들끼리 한데 모여 있다.
-
메모리에 워드, 웹 브라우저, 게임이 있다고 가정했을 때 이 세 프로그램은 서로 관련 있는 데이터끼리 모여서 저장된다.
-
그리고 프로그램 내에서도 관련 있는 데이터들은 모여서 저장된다.
만약 워드를 실행한다면 워드 프로세서 프로그램이 모여 있는 공간 근처를 집중적으로 접근할 것이고, 사용자가 입력을 한다면 입력 기능이 모여 있는 공간 근처를 집중적으로 접근한다. 이렇게 접근한 메모리 공간 근처를 접근하려는 경향을 공간 지역성 이라고 한다.
이렇게 참조 지역성의 원리에 입각해 CPU가 사용할 법한 데이터를 예측한다.