메모리 계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있습니다.
레지스터 : CPU 안에 있는 작은 메모리, 휘발성
캐시 : L1, L2 캐시를 지칭, 휘발성
주기억장치 : RAM을 가리킴, 휘발성
보조기억장치 : HDD, SSD를 일컬음, 비휘발성
휘발성 : 전원을 끊으면 저장된 데이터가 지워지는 성질
램은 하드디스크로부터 일정량의 데이터를 복사해서 임시 저장하고 이를 필요시마다 CPU에 빠르게 전달하는 역할을 합니다. 계층 위로 올라갈수록 가격은 비싸지는데 용량은 작아지고 속도는 빨라지는 특징이 있습니다.
캐시(cache)는 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 저장소이자 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말합니다. 이렇게 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐싱 계층이라고 합니다.
Cache는 아래와 같은 경우에 사용을 고려하면 좋습니다.
그렇다면 캐싱 계층을 두는 것 말고 캐시를 직접 설정할 때는 어떻게 해야 할까요?
이는 자주 사용하는 데이터를 기반으로 설정해야 합니다. 자주 사용하는 데이터에 대한 근거가 되는 것은 지역성이고 지역성은 시간 지역성과 공간 지역성으로 나뉩니다.
시간 지역성은 최근 사용한 데이터에 다시 접근하려는 특징을 말합니다.
공간 지역성은 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성을 말합니다.
캐시에서 원하는 데이터를 찾았다면 캐시히트라고 하며, 해당 데이터가 캐시에 없다면 주메모리로 가서 데이터를 찾아오는 것을 캐시미스라고 합니다.
캐시히트를 하게 되면 해당 데이터를 제어장치를 거쳐 가져오게 됩니다.
캐시히트의 경우 위치도 가깝고 CPU 내부 버스를 기반으로 작동하기 때문에 빠릅니다. 반면 캐시미스가 발생되면 메모리에서 가져오게 되는데, 이는 시스템 버스를 기반으로 작동하기 때문에 느립니다.
캐시매핑이란 캐시가 히트되기 위해 매핑하는 방법을 말하며 CPU의 레지스터와 주 메모리(RAM) 간에 데이털르 주고받을 때를 기반으로 설명합니다.
직접 매핑(directed mapping) : 메모리가 1~100이 있고 캐시가 1~10이 있다면 1:110, 2:1~20 ... 이런 식으로 매핑하는 것을 말합니다. 처리가 빠르지만 충돌 발생이 잦습니다.
연관 매핑(associative mapping) : 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑합니다. 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느립니다.
집합 연관 매핑(set associative mapping) : 직접 매핑과 연관 매핑을 합친 것입니다. 순서는 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때문에 검색은 좀 더 효율적입니다. 예를 들어 메모리가 1~100, 캐시가 1~10이 있다면 캐시 1~5에는 1~50의 데이터를 무작위로 저장시키는 것을 의미합니다.
소프트웨어적인 대표적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지가 있습니다. 이러한 것들은 보통 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰입니다.
쿠키는 만료기한이 있는 키-값 저장소입니다. same site 옵션을 strict로 설정하지 않았을 경우 다른 도메인에서 요청했을 때 자동 전송되며, 4KB까지 데이터를 저장할 수 있고 만료기한을 정할 수 있습니다. 쿠키를 설정할 때는 document.cookie로 쿠키를 볼 수 없게 httponly 옵션을 거는 것이 중요하며, 보통 서버에서 만료기한을 정합니다.
로컬 스토리지는 만료기한이 없는 키-값 저장소입니다. 10MB까지 저장할 수 있으며 웹 브라우저를 닫아도 유지되고 도메인 단위로 저장, 생성됩니다.
세션 스토리지는 만료기한이 없는 키-값 저장소입니다. 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 데이터가 삭제됩니다. 5MB까지 저장이 가능랍니다.
데이터베이스 시스템을 구축할 때도 메인 데이터베이스 위에 레디스(redis) 데이터베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 합니다.