23.12.28 메모리 계층
1. 메모리 계층
- 레지스터, 캐시, 메모리, 저장장치로 구성 됨
- 계층 위로 올라갈 수록 가격은 비싸지는데 용량은 작아지고 속도는 빨라짐
- 계층이 있는 이유는 경제성과 캐시 때문
- 예) 16GB RAM 은 9만원이면 사지만 16GB SSD 는 훨씬 더 싼 가격에 살수 있다 이러한 경제성 때문에 계층을
두어 관리
- 게임을 실행하다 보면 로딩 중 이라는 메세지가 나오는 것을 볼 수 있는데 이는 하드디스크 또는 인터넷에서
데이터를 읽어 RAM 으로 전송하는 과정이 아직 끝나지 않음을 의미함
* 레지스터
- CPU 안에 있는 작은 메모리, 휘발성, 속도가 가장 빠름, 기억 용량이 가장 작다
* 캐시
- L1, L2 캐시를 지칭. 휘발성, 속도 빠름, 기억용량이 적다 참고로 L3 캐시도 있다
* 주기억장치
- RAM 을 가리킴. 휘발성, 속도 보통, 기억 용량 보통
- 하드디스크로부터 일정량의 데이터를 복사해서 임시 저장하고 이를 필요시마다 CPU 에 빠르게 전달하는 역할
* 보조기억장치
- HDD, SSD 를 일컬으며 비휘발성, 속도 낮음, 기억용량이 많다
1) 캐시
- 데이터를 미리 복사해 놓는 임시 저장소이자 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을
줄이기 위한 메모리
- 데이터를 접근 하는 시간이 오래 걸리는 경우를 해결하고 무언가를 다시 계산하는 시간을 절약할 수 있다
- 실제로 메모리와 CPU 사이의 속도 차이가 너무 크기 때문에 그 중간에 레지스터 계층을 둬서 속도 차이를
해결하는데 이렇게 계층과 계층 사이에 있는 계층을 캐싱 계층이라 함
- 예) 캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고 할 수 있다
(1) 지역성의 원리
- 캐시를 직접 설정할 때에는 자주 사용하는 데이터를 기반으로 설정해야 한다 이에 대한 근거가 바로 지역성이다
- 지역성은 시간 지역성(temporal locality)과 공간 지역성(spatial locality)으로 나뉨
A) 시간 지역성
- 최근 사용한 데이터에 다시 접근하려는 특성
- 예) for 반복문으로 이루어진 코드 안의 변수 i 에 계속해서 접근이 이루어 질때 데이터는 변수 i 이고
최근에 사용했기 때문에 계속 접근해서 +1을 연이어 하는 것을 볼 수 있다
let arr = Array.from({length : 10}, ()=> 0);
console.log(arr)
for (let i = 0; i < 10; i += 1) {
arr[i] = i;
}
console.log(arr)
/*
[
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
]
[
0, 1, 2, 3, 4,
5, 6, 7, 8, 9
]
*/
B) 공간 지역성
- 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
- 앞의 코드에서 공간을 나타내는 배열 arr 의 각 요소들에 i 가 할당되며 해당 배열에 연속적으로 접근하는 것
2) 캐시히트와 캐시미스
- 캐시에서 원하는 데이터를 찾았다면 캐시히트
- 해당 데이터가 캐시에 없다면 주메모리로 가서 데이터를 찾아오는 것을 캐시미스라고 한다
- 캐시히트를 하게 되면 해당 데이터를 제어장치를 거쳐 가지고 오게 됨 위치도 가깝고 CPU 내부 버스를
기반으로 작동하기 때문에 빠르다
- 캐시미스가 발생되면 메모리에서 가져오게 되는데 시스템 버스를 기반으로 작동하기 때문에 느리다
A) 캐시매핑
- 캐시매핑이란 캐시가 히트되기 위해 매핑하는 방법
- CPU 의 레지스터와 주 메모리(RAM) 간에 데이터를 주고 받을 때를 기반으로 설명한다
- 레지스터는 주 메모리에 비하면 굉장히 작고 주 메모리는 굉장히 크기 때문에 작은 레지스터가
캐시 계층으로써 역할을 잘해 주려면 이 매핑을 어떻게 하느냐가 중요
이 름 | 설 명 |
직접 매핑 (directed mapping) |
메모리가 1 ~ 100 이 있고 캐시가 1 ~ 10 이 있다면 1:1 ~ 10, 2:1 ~20 ... 이런식으로 매핑하는 것을 말함. 처리가 빠르지만 충돌 발생이 잦다 |
연관 매핑 (associcative mapping) |
순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑함 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느리다 |
집합 연관 매핑 (set associative mapping) |
직접 매핑과 연관 매핑을 합쳐 놓은 것 순서는 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때문에 검색은 좀 더 효율적 예) 메모리가 1 ~ 100 이 있고 캐시가 1 ~ 10 이 있다면 캐시 1 ~ 5 에는 1 ~ 50 의 데이터를 무작위로 저장시키는 것을 말함 |
B) 웹 브라우저의 캐시
- 소프트웨어적인 대표적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지가 있다
- 보통 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때
자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰임
(A) 쿠키
- 만료기한이 있는 키-값 저장소
- same site 옵션을 strict 로 설정하지 않았을 경우 다른 도메인에서 요청했을 때 자동 전송됨
- 4KB 까지 데이터를 저장할 수 있고 만료기한을 정할 수 있다.
- 설정할 때는 document.cookie 로 쿠키를 볼 수 없게 httponly 옵션을 거는 것이 중요하고
클라이언트 또는 서버에서 만료기한 등을 정할 수 잇는데 보통 서버에서 정함
(B) 로컬 스토리지
- 만료기한이 없는 키-값 저장소
- 10MB 까지 저장할 수 있으며 웹 브라우저를 닫아도 유지되고 도메인 단위로 저장, 생성 된다
- HTML5 를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 클라이언트에서만 수정 가능
(C) 세션 스토리지
- 만료기한이 없는 키-값 저장소
- 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 데이터가 삭제 됨
- 5MB 까지 저장이 가능하며 HTML5 를 지원하지 않는 웹 브라우저에서는 사용할 수 없고
클라이언트에서만 수정 가능
C) 데이터베이스의 캐싱 계층
- DB 를 구축할 때도 메인 DB 위에 레디스(redis) DB 계층을 캐싱 계층으로 둬서 성능을 향상 시키기도 함