이 글은 면접을 위한 CS 전공지식노트의 책을 읽고 학습 후 스터디 공유를 위한 글입니다.
메모리 계층

- 레지스터 CPU 안에 있는 휘발성 메모리, 속도가 제일 빠르고 용량이 제일 작다
- 캐시 L1, L2, L3 캐시를 지칭, 휘발성 메모리
- 주기억장치: RAM, 휘발성 메모리
- 보조기억장치: HDD, SSD(Solid State Drive) or
SDD(Solid Disk Drive) 책에는 이렇게 나왔지만 잘 안쓰는 것 같음…
캐시
- 데이터를 미리 복사해 놓는 임시 저장소. 빠른 장치와 느린 장치 사이에 위치해 속도차이에 따른 병목현상을 줄이기 위한 메모리.
- ex. CPU와 RAM 사이의 속도차가 크기 때문에 레지스터 계층을 둬 이를 해결
- 개념적으로는 캐시메모리와 보조기억장치 사이에 있는 주기억장치도 캐싱 계층이라고 할 수 있다.
지역성의 원리
- 캐시 계층을 물리적으로 두는 것을 말고 캐시를 소프트웨어적으로 설정할 때는 어떻게 사용해야할까? → 자주 사용하는 데이터를 기반으로 설정해야한다. → 자주 사용하는 데이터에 대한 근거:
**지역성
**
시간 지역성
-
최근 참조된 기억 장소는 미래(시간)에 다시 참조될 가능성이 높은 특성

변수 i는 최근에 사용되었기 때문에 미래에 사용될 가능성이 높다.
ex. 순환, 서브루틴, 스택, 계산과 집계에 사용되는 변수
공간 지역성
- 참조된 기억장소의 근처에 있는 기억장소는 참조될 가능성이 높은 특성
-
위 코드에서 공간을 나타내는 배열의 각 요소들에 i가 할당되며 해당 배열을 연속적으로 접근하는 것을 볼 수 있다.
ex. 배열 순회, 순차적 코드 실행, 관련된 변수를 함께 선언
캐시히트와 캐시미스

- 캐시히트: 캐시에서 원하는 데이터를 찾은 경우. CPU와의 거리도 가깝고 CPU 내부 버스를 사용하기 때문에 속도가 빠르다.
- 캐시미스: 캐시에서 원하는 데이터를 찾지 못해 주메모리로 가서 데이터를 찾아오는 경우. 메모리에서 데이터를 가져오는데 시스템 버스를 사용하기 때문에 상대적으로 속도가 느리다.
캐시매핑
- 캐시가 히트되기 위해 매핑하는 방법. CPU의 레지스터와 주메모리(RAM) 간에 데이터를 주고받을 때 이를 기반으로 한다.
직접 매핑(directed mapping) | 메모리가 1~100이 있고 캐시가 1~10이 있다면 1:1~10, 2:10~20 이런식으로 매핑. 처리가 빠르지만 충돌발생이 잦다. |
---|
연관 매핑(associative mapping) | 순서를 일치시키지 않고 관련 있는 캐시와 메모리 매핑. 충돌이 적지만 모든 블록을 탐색해야해서 속도가 느리다. |
집합 연관 매핑(set associative mapping) | 직접매핑 + 연관 매핑. 순서는 일치시키지만 집합을 둬서 저장하여 블록화되어있기 때문에 검색이 좀 더 효율적이다. |
캐시 적용 예 - 웹 브라우저
- 쿠키, 로컬 스토리지, 세션 스토리지 → 보통 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해 추후 서버에 요청할 때 자신을 알리는 아이덴티티나 중복 요청 방지를 위해 사용.
쿠키
- 만료기한이 있는 키-값 저장소.
- same site 옵션을 strict로 설정하지 않으면 다른 도메인에서 요청 시 자동 전송
- 4KB 용량, 클라이언트나 서버에서 만료기한 설정 가능(주로 서버에서 만료기한을 설정한다.)
- document.cookie로 쿠키를 볼 수 없게 httponly 옵션을 거는 것이 중요.
로컬 스토리지
- 만료기한이 없는 키-값 저장소.
- 브라우저를 닫아도 유지. 도메인 단위로 저장, 생성
- 10MB 용량, HTML5 지원하는 브라우저에서 사용 가능.
- 클라이언트에서만 수정 가능
세션 스토리지
- 만료기한이 없는 키-값 저장소.
- 탭을 닫으면 삭제. 탭 단위로 저장, 생성
- 5MB 용량, HTML5 지원하는 브라우저에서 사용 가능.
- 클라이언트에서만 수정 가능
캐시 적용 예 - 데이터베이스의 캐싱 계층(Redis)
- 메인 데이터베이스 위에 Redis 데이터베이스 계층을 ‘캐싱 계층’으로 둬서 성능을 향상시키기도 한다.
🤖 조금 더 자세한 흐름이 궁금해 GPT에게 물어본 레디스를 데이터베이스의 캐싱계층으로 두었을 때의 흐름
- 요청이 들어옴: 클라이언트가 데이터를 요청합니다. 이 데이터는 데이터베이스에 저장되어 있지만, 레디스에는 아직 캐시되어 있지 않을 수 있습니다.
- 캐시 조회: 레디스에 해당 데이터가 캐시되어 있는지 확인합니다.
- 캐시 히트: 레디스에 데이터가 캐시되어 있고 유효한 경우입니다. 캐시 히트가 발생하면 레디스에서 데이터를 직접 반환합니다.
- 캐시 미스: 레디스에 데이터가 캐시되어 있지 않거나 유효하지 않은 경우입니다. 캐시 미스가 발생하면 이후 단계에서 데이터베이스에서 데이터를 가져와 캐시에 저장하게 됩니다.
- 데이터베이스 조회: 캐시 미스가 발생하면 데이터베이스에 데이터를 요청합니다.
- 데이터베이스 응답 및 캐시 업데이트: 데이터베이스는 요청받은 데이터를 반환합니다. 이 데이터를 레디스에 캐시합니다.
- 레디스로부터 데이터 반환: 레디스가 데이터베이스로부터 받은 데이터를 클라이언트에 반환합니다.
- 이후 요청 시 캐시 히트: 이후 동일한 데이터에 대한 요청이 들어오면 레디스에서 캐시 히트가 발생하여 데이터베이스에 직접 접근하는 것보다 더 빠르게 응답할 수 있습니다.
이와 같은 흐름을 통해 레디스를 데이터베이스의 캐싱 계층으로 두면, 자주 요청되는 데이터는 레디스에 캐시되어 빠른 응답 시간을 제공하고, 데이터베이스의 부하를 줄일 수 있습니다.