[운영체제] 캐시 (Cache)
[운영체제] 캐시 (Cache)
메모리 용량이 작을수록 파일을 저장하고 꺼내오는 속도는 더 빠릅니다. 그렇기 때문에 용량이 큰 저장장치는 속도가 느릴수밖에 없습니다.
하지만 메모리 용량이 크고, 속도가 빠른 두 가지 장점을 잡기에는 비용이 너무 많이 듭니다.
그래서 데이터 저장 공간은 속도와 용량 등 특성에 맞게 역할을 나눠서 사용하는데, 이를 메모리 계층 구조라고 합니다.
위 그림처럼 데이터 처리속도를 높이기 위해 자주 사용되는 데이터를 담아두고, 해당 데이터가 필요할 때 캐시에 접근합니다.
데이터 지역성 원리 (Principle of Locality)
파레토의 법칙은 원인 중 상위 20% 가 전체 결과의 80% 를 만든다는 법칙입니다.
이 법칙은 메모리에도 적용되는데요, 자주 쓰이는 데이터는 시간적 혹은 공간적으로 한 곳에 몰려있을 가능성이 높습니다. 이는 데이터 지역성의 원리라고 불립니다.
데이터 지역성은 크게 2가지로 나뉩니다.
시간 지역성
- 최근 접근한 데이터에 다시 접근하는 경향
- for 문에서 인덱스 역할을 하는 변수 i 는 짧은 시간안에 여러번 접근이 이뤄짐
공간 지역성
- 최근 접근한 데이터의 주변 공간에 다시 접근하는 경향
- 배열을 차례대로 탐색할 때 가까운 메모리 공간에 연속적으로 접근
- 배열은 연속적인 메모리 공간을 가지기 때문
// 시간 지역성 - 반복해서 변수 i 에 접근
for i in 0 ... 10 {
// 공간 지역성 - 연속적인 메모리공간 (배열) 에 접근
array[i] = i
}
캐시 동작 방식
- 원본 데이터와는 별개로 자주 쓰이는 데이터 (Hot Data) 들을 복사해둘 캐시 공간 마련
- 캐시 공간은 O(1) 등 낮은 시간복잡도로 접근 가능한 곳을 주로 사용
- 데이터 요청이 들어오면 원본 데이터가 담긴 곳에 접근하기 전 먼저 캐시 내부부터 탐색
- 캐시에 원하는데이터가 없거나 (Cache Miss), 너무 오래되어 최신성을 잃었을때 (Expiration)
- 원본 데이터가 있는 곳에 접근해 데이터를 가져옴
- 이 때 데이터를 가져오며 캐시에도 해당 데이터를 복사하거나 갱신함
- 캐시에 원하는 데이터가 있을때 (Cache Hit)
- 원본 데이터가 있는 공간에 접근하지 않고 바로 해당 데이터 제공
- 캐시 공간은 작기 때문에 공간이 모자라게 되면 안쓰는 데이터부터 삭제하여 공간 확보 (Eviction)
캐시 종류
CPU 칩에는 여러개의 캐시가 들어가며 각각의 캐시는 각자의 목적과 역할을 가지고 있습니다.
L1 캐시
- 프로세서와 가장 가까운 캐시, 속도를 위해 I$ 와 D$ 로 나눔
- I$ (Instruction Cache) : 메모리의 텍스트 영역 데이터를 다루는 캐시
- D$ (Data Cache) : 텍스트 영역을 제외한 모든 데이터를 다루는 캐시
L2 캐시
- 용량이 큰 캐시, 크기를 위해 L1 캐시처럼 나누지 않음
L3 캐시
- 멀티 코어 시스템에서 여러 코어가 공유하는 캐시
캐시에 달러 기호 $ 를 사용하는 이유는 Cache 와 현금을 뜻하는 Cash 의 발음이 같기 때문입니다.
캐시 성능 측정
캐시의 성능을 측정할 때는 Hit Latency 와 Miss Latency 가 중요한 요인으로 꼽힙니다.
- CPU 에서 요청한 데이터가 캐시에 존재하는 경우를 Hit, 그렇지 않은 경우를 Miss 라고 함
- Hit Latency 는 Hit 가 발생해 캐싱된 데이터를 가져올때 소요되는 시간
- Miss Latency 는 Miss 가 발생해 상위 캐시나 메모리에서 데이터를 가져올때 소요되는 시간
- ex) L1 캐시에 데이터가 존재하지 않아 L2 캐시나 메모리에서 데이터를 가져올 때
평균 접근 시간은 다음과 같은 식으로 구할 수 있습니다.
위 식을 보면 알 수 있듯이, 캐시의 성능을 높이기 위해서는 다음과 같은 방법들을 이용할 수 있습니다.
- 캐시 크기를 줄여서 Hit Latency 를 줄인다
- 캐시 크기를 늘려서 Miss 비율을 줄인다
- 더 빠른 캐시를 이용해 Latency 를 줄인다
캐시 활용 예시
CPU 의 캐시 메모리
- 현대 CPU 는 1초에 수십억번씩 작동 가능
- 아무리 빠른 메모리라도 CPU 속도를 따라오기 어려움
- 그래서 SRAM 이라는 특수 메모리를 CPU 에 넣어 캐시 메모리로 사용
- 하드 디스크는 메인 메모리에 비해 10만배 이상 느림
- 처리 효율을 올리기 위해서 자주 사용하는 데이터는 캐싱해두는것이 좋음
- 데이터베이스 또한 쿼리를 실행하여 하드 디스크에서 데이터를 읽고 쓰는 것이 오래걸림
- 데이터베이스는 대부분 쓰기보다 읽기가 많아서 자주 요청받는 쿼리의 결과를 캐싱해두면 효율이 오름
CDN (Content Delivery Network)
- 세계 각지에 캐시 서버를 두어 전송속도를 높이고 부하를 분산하는 시스템
- Google 은 각 통신사마다 Google Global Cache 를 둬서 인기있는 Youtube 영상은 미국서버까지 접속할 필요 없이 국내서버에서 처리하도록 함
- 장점은 비싼 국제 회선 비용이 절감 및 버퍼링 감소
웹 캐시
- 네트워크를 통해 데이터를 가져오는 것은 하드디스크보다 느릴때가 많음
- 브라우저 캐시
- 브라우저는 웹 페이지에 접속할때 HTML, CSS, JS, 이미지등을 하드 디스크나 메모리에 캐싱해뒀다가 다음번에 다시 접속할 때 이를 재활용함
- 응답 캐시
- 웹 서버 또한 상당수의 경우 동적 웹 페이지라 할지라도 매번 내용이 바뀌지 않는 경우가 더 많음
- 그래서 서버에서 생성한 HTML 을 캐싱해뒀다가 다음번 요청에 이를 재활용함
- 프록시 캐시
- 클라이언트에서 자주 요청받는 내용은 웹 서버로 전달하지 않고 웹 서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공하기도 함
참고 링크
https://parksb.github.io/article/29.html
https://chelseashin.tistory.com/43
https://www.youtube.com/watch?v=c33ojJ7kE7M&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=124