캐시 메모리(Cache Memory)

JIHYE·2023년 3월 30일
0

[CS지식]

목록 보기
1/8
post-thumbnail

1. 캐시 메모리(Cache Memory)란?

  • 프로그램을 동작시키기 위해서는 메모리에 적재가 되고 CPU를 할당받아야 동작

  • CPU메모리(RAM) 사이에서 데이터를 주고받게 되는데 CPU에 비해 비교적 속도가 느린 메모리에 의해서 제대로 성능을 내지 못해 캐시 메모리를 사용하여 CPURAM 사이에서 발생하는 병목 현상을 완화

  • 캐시 메모리CPU 사이에 존재하며 캐시 메모리에 데이터가 존재한다면 메모리에 접근할 필요가 없으므로 성능상 이점을 얻을 수 있음

2. 적중 & 실패

  • 원본 데이터(System-of-Record)와는 별개로 자주 쓰이는 데이터(Hot Data)들을 복사해둘 캐시 공간을 마련. 캐시 공간은 상수 시간 O(1) 등 낮은 시간 복잡도로 접근 가능한 곳을 주로 사용

  • CPU메모리에 접근하기 전에 캐시 메모리를 먼저 들러 찾고자 하는 데이터가 있는지 확인

  • 필요한 데이터를 찾았을 때 : 적중(Cache Hit)

  • 필요한 데이터를 찾지 못했을 때 : 실패(Cache Miss)

  • 요청한 데이터를 캐시 메모리에서 찾을 확률을 캐시 적중률(cache hit ratio)이라고 하며 캐시 메모리의 성능은 적중률에 의해 결정

  • 적중률 = 캐시 메모리의 적중 횟수 / 전체 메모리의 참조 횟수

  • CPU는 데이터를 가져오기 위해서 캐시 메모리 -> 주기억장치(Memory) -> 보조기억장치(Disk) 순으로 접근

  • Cache Hit 할 경우 : 캐시 메모리에서 데이터를 CPU 레지스터에 복사한다.

  • Cache Miss & 메모리에서 찾았을 경우 : 메모리의 데이터를 캐시 메모리에 복사하고, 캐시 메모리에 복제된 내용을 CPU 레지스터에 복사

  • Cache Miss & 메모리에서 찾지 못했을 경우 : 보조기억장치에서 메모리에 적재하고 적재된 내용을 캐시 메모리에 복사. 그리고 캐시 메모리의 데이터를 CPU 레지스터에 복사

  • 캐시에 원하는 데이터가 없거나(Cache miss) 너무 오래되어 최신성을 잃으면(Expiration) 원본 데이터가 있는 곳에 접근. 이때, 데이터를 가져오면서 캐시에도 해당 데이터를 복사하거나 혹은 갱신

  • 캐시 공간은 작으므로, 공간이 모자르게 되면 안 쓰는 데이터부터 삭제하여 공간을 확보(Eviction)

3. 데이터 지역성

3.1 시간적 지역성(Temporal Locality)

  • 사용되었던 데이터가 가까운 시일 내에 한 번 더 사용될 가능성이 큰 성질
    ex) for문에서 선언된 조건변수

3.2 공간적 지역성(Spatial Locality)

  • 사용되었던 데이터의 인접 데이터가 사용될 가능성이 큰 성질
    ex) for문에서 배열에 접근했을때, 해당 배열이 위치한 메모리 공간의 내용은 for문이 끝나기 전까지 계속 쓰일 확률이 높음

3.3 순차적 지역성(Sequential Locality)

  • 분기가 발생하지 않는 이상 순차적으로 실행될 가능성이 큰 성질
    ex) for문에서 array[0], array[1] 와 같이 배열에 접근 할 때, 다음번에는 array[2]에 접근할 확률이 높은 것을 따로 분류하여 순차지역성이라고 함

4. 캐시가 쓰이는 사례

4.1 CDN(Content Delivery Network)

  • ex) youtube 메인 서버는 미국에 있으며, 한국과 미국을 잇는 국제 인터넷 회선은 비싸고 용량을 늘리기 어려워, 각 통신사마다 Google Global Cache를 두어 인기있는 동영상을 국내 서버에서 처리하도록 하는 것

4.2 웹 캐시

  • 웹 브라우저는 웹 피이지에 접속할 때, HTML, CSS, JS, 이미지 등하드디스크나 메모리에 캐싱해 뒀다가 다음 접속때 이를 재활용함 --> 브라우저 캐시

  • 웹 서버 또한 상당수의 경우 동적 웹 페이지라 할지라도 매번 내용이 바뀌지 않는 경우가 더 많으므로, 서버에서 생성한 HTML을 캐싱해뒀다가 다음번 요청에 재활용

  • 클라이언트에서 자주 요청받는 내용은 웹 서버로 전달하지 않고, 웹 서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공 --> 프록시 캐시

4.2.1 브라우저 캐시

  • 웹 서버에서 클라이언트에 보내는 HTTP 헤더에 캐시 지시자를 삽입하면, 클라이언트 웹 브라우저에서는 해당 지시자에 명시된 캐시 정책에 따라 캐싱을 실시

  • 캐시의 유효 시간(max-age)이 지나도 캐시된 데이터가 바뀌지 않는 겅우를 확인하기 위해 ETag라는 유효성 검사 토큰을 이용

  • 캐시 유효 시간을 최대한 길게 잡으면서도 정적(Static) 파일 업데이트를 신속하게 적용하기 위해 정적 파일의 이름 뒤에 별도의 토큰이나 버전 번호를 붙이는 경우도 존재

<script src="test.js?v=1></script>
  • 캐시 정책은 해당 웹페이지의 전반적인 상황에 까라 각 파일마다 다르게 적용되어야 함. 적어도 정적 파일과 동적인 부분의 브라우저 캐싱 정책은 달라야 함. 비공개 정보가 담긴 페이지는 보안상 아예 캐싱을 막아야할수도있음

4.3 Redis

  • Remote Dictionary Server의 약자

  • 메모리 기반 오픈소사 NoSQL DBMS의 일종으로, 웹 서비스에서 캐싱을 위해 많이들 씀

  • 캐시에서 사용하는 Dictionary는 Java의 HashMap<key, value>를 생각하면 됨. key를 넣으면 바로 value가 나오는 방식

  • 기본적으로 모든 데이터를 메모리에 저장하여 처리하므로 속도가 빠름

  • 서버 재부팅 때 메모리의 데이터가 휘발되지 않게끔 데이터를 하드디스크에 기록할 수 있음

  • DBMS의 일종이므로, 명시적으로 삭제하지 않는한 메모리에서 데이터를 삭제하지않음

  • 자체적으로 여러가지 자료형 지원

4.4 EHCache

  • Java 진영에서 가장 널리 사용
  • Spring Framework나 Hibernate ORM 등에서 바로 사용 가능
  • 메모리에 캐시된 내용을 하드디스크에 기록 가능
  • 캐시 저장공간을 속도이 따라 여러 등급(Tier)으로 나누어 메모리 계층 구조를 적용가능
  • 대규모 서비스에서 캐시 서버 여럿을 클러스터로 묶을 수 있는 기능을 제공

[출처]

0개의 댓글