본문 바로가기
둥지/CS

캐싱

by 까닭 2023. 4. 3.

캐싱은 데이터를 나중에 쉽게 재사용할 수 있도록 미리 연산해두는 것을 말한다.
컴퓨터의 프로세스들은 최근에 자주 사용하거나 자주 사용된 메모리를 캐싱하여
상대적으로 느린 메인 메모리의 접근 횟수를 줄여 성능을 향상시킨다.
 
대부분의 메모리 위치들은 짧은 시간동안 한 번 이상 접근되기 때문에
하드웨어 수준에서 캐싱할 경우 연산 성능 향상에 크게 도움이 된다.
 
캐싱은 소프트웨어에 있어서도 비슷한 접근을 한다.
 
만약 어떤 작업 또는 연산이 특별히 느리다면, 연산을 필요한 것보다 많이 수행하는 것은 낭비일 것이다.
때문에 한 번 작업한 결과는 메모리에 저장해두고 나중에 필요할 때 재사용할 수 있어야 한다.
 

일반적으로 느린 작업들

디스크 접근

같은 파일을 두 번 이상 열고 읽는 것은 피해야 한다. (아마 파일 시스템을 커널이 관리하기 때문인듯)
만약 메모리에 여유가 있다면 파일의 내용물을 램에 저장해두고 필요할 때마다 이용하는 편이 좋다.

네트워크 통신

네트워크를 통해 통신해야 한다면 프로그램이 네트워크의 비예측성에 영향을 받게 된다.
네트워크 접근을 파일 접근과 비슷하게 취급하여 최대한 정적인 정보만을 캐싱해야 한다.

수학 계산

어떤 계산 결과를 여러 곳에서 사용해야 할 경우, 계산을 단 한 번만 하고 그 결과를 공유하도록 하는 게 좋다.

객체 생성

수명이 짧은 객체들을 많이 이용, 관리해야 한다면 오브젝트 풀을 고려해보자.

스레드 생성

스레드를 생성하는 작업은 프로그램을 느려지게 할 수 있다.
스레드 또한 미리 생성하여 스레드풀에 캐싱해두자.
 

캐시 무효화

캐시

캐시는 데이터를 임시 저장해놓는 메모리이다.
캐시를 사용할 때 흔하게 발생하는 문제로 데이터 유효성 문제가 있다.
캐시에 저장된 데이터는 보통 데이터의 복제본인 경우가 많은데
캐시에 데이터가 저장된 동안 원본이 변경될 수 있다.
 
예를 들어보자면,
 
반복되는 디스크 접근을 줄이기 위해 설정 파일의 값들을 캐싱했을 때,
유저가 설정 파일을 변경할 수 있는 경우 캐시된 데이터가 유효하지 않을 수 있다.
이런 경우에는 캐시 무효화 알고리즘이 필요하다.

여기서 캐시 무효화(cache invalidation)란, 캐시의 값을 갱신하는 것을 말한다.

즉, 캐싱한 원본 데이터에 변경이 있을 경우 캐시 정보의 이용을 멈추고 캐시 내용도 새로 저장해야 한다는 것.


캐시 무효화 매커니즘의 한 가지 방식을 꼽자면,
캐싱 대상 데이터의 변경을 알려주는 어떤 관리자를 두는 것이다.
관리자에 콜백(함수 포인터)을 등록하는 형태로 캐시에서 일종의 알림을 받는 것이 좋다.
 
다른 방법으로는, 캐시를 저장해야만 하는 어떤 이벤트를 주기적으로 확인하는 방법도 있다.
 
캐시 무효화 매커니즘을 어떤 식으로 구현하든 캐시를 사용하기 전에
캐시 무효화 문제가 있음을 인식하고 위 방식처럼 대비해 두어야 한다.

'둥지 > CS' 카테고리의 다른 글

C# 인터페이스와 추상 클래스 정리  (0) 2023.07.21
[C++ 키워드] const, constexpr  (0) 2023.06.22
C/C++ 더블 포인터 사용 까닭  (0) 2023.05.01