////
Search

4 : 메모리

실행 중인 프로그램 → 메모리에 저장 → CPU는 메모리에 저장된 정보를 읽고, 쓰고, 실행

RAM

휘발성 저장장치 : 전원을 끄면 저장하고 있던 데이터 & 명령어가 날아감
CPU가 어떠한 프로그램을 실행하고자 한다면, 보조기억장치(보관할 프로그램을 저장하는 HW)에서 메모리로 복사 필요

임의 접근(Random Access)

직접 접근(Direct Access) 라고도 함
저장된 요소에 순차적으로 접근할 필요 없이 임의 위치에 곧장 접근 가능한 방식
1번지든 1000번지든 접근하고자 하는 데이터에 접근하는 시간이 동일

RAM 종류

1) DRAM(Dynamic RAM)

시간이 지나면 저장된 데이터가 점차 사라지는 RAM
D(Dynamic) : 저장된 데이터가 동적으로 변하는(사라지는) 특성
→ 데이터 소멸을 막기 위해 일정 주기로 데이터를 재활성화(다시 저장) 필요
소비 전력이 낮고, 저렴하고, 집적도가 높음 → 메모리를 대용량으로 설계하기 용이

2) SRAM(Static RAM)

시간이 지나도 저장된 데이터가 사라지지 않는 RAM
S(Static) : 저장된 데이터가 변하지 않는 특성
다만 이 말이 비휘발성 저장장치라는 뜻은 아님
속도 빠르고, 소비 전력이 크고, 가격이 비싸고, 집적도가 낮음 → 캐시 메모리 등에서 사용 (대용량으로 만들 필요는 없지만 속도는 빨라야 하는 저장장치)

3) SDRAM(Synchronous Dynamic RAM)

클럭 신호와 동기화된, 보다 발전된 형태의 DRAM
클럭 신호와의 동기화 = 클럭 타이밍에 맞춰 CPU와 정보 주고 받기 가능
즉, 클럭에 맞춰 작동하며 CPU와 정보 주고 받기가 가능한 DRAM

4) DDR SDRAM(Double Data Rate SDRAM)

대역폭을 넓혀 속도를 빠르게 만든 SDRAM
대역폭 : 데이터를 주고받을 길의 너비
한 클럭당 SDRAM보다 전송 속도가 두 배 가량 빠름

메모리에 바이트를 밀어 넣는 순서 - 빅 엔디안 & 리틀 엔디안

메모리는 대부분 데이터를 바이트 단위로 저장 및 관리. 그러나 CPU로부터 받는 데이터는 일반적으로 4바이트(32비트), 8바이트(64비트)인 워드 단위 → 여러 바이트로 구성된 데이터를 받아 여러 주소에 걸쳐 저장
예시 1) 16진수 1A2B3C4D(4바이트)
1A, 2B, 3C, 4D로 나눠 4개의 주소에 저장
예시 2) 16진수 1A2B3C4D5A6B7C8D(8바이트)
1A, 2B, 3C, 4D, 5A, 6B, 7C, 8D로 나눠 8개의 주소에 저장
메모리에 바이트를 저장하는 방식에는, 연속해서 저장해야 하는 바이트를 어떤 순서로 저장하는지에 따라 빅 엔디안과 리틀 엔디안으로 나뉨

빅 엔디안

낮은 번지 주소에 상위 바이트부터 저장하는 방식
상위 바이트 : 가장 큰 값
10진수 123 → 상위 바이트는 1(100이므로)
16진수 1A2B3C4D → 상위 바이트는 1A(최상위 8비트이므로)

리틀 엔디안

낮은 번지 주소에 하위 바이트부터 저장하는 방식
하위 바이트 : 가장 작은 값
10진수 123 → 하위 바이트는 3
16진수 1A2B3C4D → 하위 바이트는 4D

각 장단점

빅 엔디안

일상적으로 숫자 체계를 읽고 쓰는 순서와 동일 → 메모리 값을 읽거나(특히 디버깅시) 할 때 편리
수치 계산이 어려움

리틀 엔디안

수치 계산이 편리
덧셈을 할 때, 가장 작은 값(하위 바이트)부터 수치를 계산해나가고 자리올림을 하기 때문
메모리 값을 사람이 직접 읽고 쓰기는 불편

캐시 메모리

CPU가 프로그램을 실행하다보면 빈번히 메모리에 접근해야하는데 CPU는 연산을 많이 하고 메모리 접근 횟수를 줄여야 CPU의 빠른 연산 속도를 최대한 뽑아먹을 수 있기에, 캐시 메모리(저장장치)를 이용해 보완
캐시 메모리 : CPU의 연산 속도와 메모리 접근 속도의 차이를 줄이기 위해 탄생한 저장장치
CPU와 메모리 사이에 위치한 SRAM 기반의 저장장치 (DRAM[= RAM]의 캐시 저장장치)
메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리에 가져와 활용

여러 종류의 캐시 메모리

단일 코어 프로세서

코어 내부 위치
L1 캐시
L2 캐시
코어 외부 위치
L3 캐시
캐시 메모리 크기 : L1 < L2 < L3
캐시 메모리 속도 : L3 < L2 < L1

멀티 코어 프로세서

L1, L2 캐시 메모리 : 코어마다 고유한 캐시 메모리로 할당
L3 캐시 메모리 : 여러 코어가 공유하는 형태
분리형 캐시
L1 캐시 메모리에서,
L1I 캐시 : 명령어만 저장
L1D 캐시 : 데이터만 저장

캐시 히트 & 캐시 미스

캐시 메모리는 CPU가 사용할 법한 것들을 저장
캐시 히트 : 캐시 메모리가 예측하여 저장한 데이터가 CPU에 의해 실제 사용되는 경우
캐시 미스 : 캐시 메모리에 저장했지만 틀린 예측으로 인해 CPU가 메모리로부터 필요한 데이터를 직접 가져와야 하는 경우

참조 지역성의 원리

CPU가 사용할 법한 데이터를 예측하는 방법
CPU가 메모리에 접근할 때 보이는 다음과 같은 주된 경향을 의미
시간 지역성 : CPU는 최근 접근했던 메모리 공간에 다시 접근하는 경향 존재
EX) 변수 : 변수에 저장된 값은 프로그램이 실행되는 동안 여러 번 사용
공간 지역성 : CPU는 접근한 메모리 공간 근처에 접근하는 경향 존재
EX) 배열 : 2차원 배열에서 열부터 순회하지말고 행부터 순회해야 실행 속도가 빠름

캐시 메모리의 쓰기 정책과 일관성

캐시 메모리에 데이터를 쓰는 경우
CPU가 캐시 메모리에 데이터를 쓰는 경우, 캐시 메모리에 새롭게 쓰여진 데이터와 메모리 상의 데이터가 일관성을 유지할 필요가 있음

쓰기 방식 1) 즉시 쓰기

write-through
캐시 메모리와 메모리에 동시에 쓰는 방법
메모리를 항상 최신 상태로 유지 → 캐시 메모리와 메모리 간 일관성이 깨지는 상황 방지
데이터를 쓸 때마다 메모리 참조 → 버스 사용 시간과 쓰기 시간 증가

쓰기 방식2) 지연 쓰기

write-back
캐시 메모리에만 써 두었다가 추후 수정된 데이터를 한 번에 메모리에 반영하는 방법
속도는 더 빠름
메모리와 캐시 메모리 간 일관성이 깨질 위험 존재
캐시 메모리 메모리 간 불일치도 존재하지만, 다른 코어가 사용하는 캐시 메모리와의 불일치도 발생 가능

강조 내용

캐시 메모리를 사용한다(캐싱을 한다)
데이터 접근에 있어 어느 정도의 빠른 성능 보장
데이터 일관성 유지를 위한 책임이 따르는 방식
자주 사용할 법한 대상을 가까이 위치시킴으로써 성능 향상을 꾀함 (네트워크나 다른 파트에서의 캐시 개념도 본질적으로 동일)
캐싱을 할 때는, 언제나 캐시된 데이터와 원본 데이터 간 불일치데이터 일관성을 고려할 필요 존재