
캐시 메모리(cache memory)는 프로세서와 주 메모리 사이에 위치한 용량은 작지만 속도는 빠른 저장 장치를 의미합니다. 이 장치의 용도는 어떤 프로세스가 동작할 때 많이 접근하는 자료를 저장해 두는 것이죠. 프로세스가 특정한 자료를 필요로 할 때 해당 자료가 최신의 상태로 캐시 메모리에 존재한다면, 주 메모리에 직접 접근하지 않고 캐시 메모리에 접근하여 자료를 가져옴으로써 상당한 시간적 이득을 꾀할 수 있습니다.
프로세스가 호출하는 자료의 단위를 페이지(page)라고 부르겠습니다. 만약 프로세스가 어떤 페이지를 필요로 하는데, 최신의 해당 페이지가 캐시 메모리에 존재하는 때를 캐시 히트(cache hit), 그렇지 않을 때를 캐시 미스(cache miss)라고 부릅니다. 전자의 경우에는 캐시 메모리의 자료를 곧장 참조하면 되므로 빠른 시간에 수행할 수 있지만, 후자의 경우에는 주 메모리에서 해당 페이지를 읽어 와야 하므로 상당한 시간이 소요됩니다. 그러니 당연히 우리는 캐시 히트의 수는 늘리고 캐시 미스의 수는 최소화하고 싶겠죠. 만약 캐시 메모리의 용량이 프로세스가 필요로 하는 페이지를 몽땅 올릴 수 있을 정도로 충분하다면 캐시 미스는 일어나지 않을 것입니다. 문제는 캐시 메모리의 용량이 상대적으로 매우 작다는 점입니다. 그러므로 어떤 페이지를 캐시 메모리에 올려 두려고 할 때 캐시 메모리는 이미 가득 찬 경우가 부지기수일 터입니다. 이때, 캐시 메모리에 저장된 페이지 중 어떤 페이지를 지울지 결정하는 것은 캐시 메모리의 성능과 직결되는 대단히 중요한 문제입니다.
벌써 3년 전, 저는 유명한 페이지 교체 전략 중 하나인 LRU(least recently used)를 분석하는 글을 적었습니다. 이 전략은 페이지 교체가 필요할 때 가장 오랫동안 사용되지 않은 페이지를 지우는 방법입니다. 그 글에서 저는 이 전략이 사실은 보다 일반적인 알고리즘인 마킹 알고리즘(marking algorithm)의 하나의 구현에 해당함을 보였습니다. 또한, 모든 마킹 알고리즘은 캐시 메모리의 용량을
2020.04.04 - [온라인 알고리즘/Caching] - [캐싱 / Caching] LRU는 얼마나 좋은 알고리즘일까?
[캐싱 / Caching] LRU는 얼마나 좋은 알고리즘일까?
세세한 부분을 많이 놓치기는 하겠지만, 간략히 말해 컴퓨터는 다음과 같이 동작합니다. 메모리에서 데이터를 프로세서로 가지고 와서 사칙 연산, 대소 비교 등과 같이 어떠한 작업을 수행한 다
gazelle-and-cs.tistory.com
글의 말미에는 다음과 같은 질문을 던졌습니다. 이는 컴퓨터 과학의 숙명과도 같은 질문입니다.
- 과연 더 적은 캐시 미스를 보장하는 알고리즘이 존재하는가?
이번 포스트에서 이 질문에 대한 긍정적인 답변을 드리도록 하겠습니다. 좀더 엄밀히 말하자면, 훨씬 적은 횟수의 캐시 미스를 이론적으로 기대할 수 있는 알고리즘이 존재합니다. 제가 '기대'라는 표현을 사용한 것에서 유추하셨겠지만, 이 알고리즘은 내부에 확률 시행이 존재하는 랜덤 알고리즘(randomized algorithm)입니다. 결론을 미리 말씀 드리자면, 이 알고리즘은 입력이 어떻게 주어지든지 간에 평균적으로
글의 제목은 마치 본문에서 소개할 알고리즘이 LRU보다 모든 면에서 뛰어나다는 인상을 주는 것 같습니다. 제목이 자극적이라는 것을 인정하는 바입니다. LRU는 (이론적으로는 부족할지언정) 실제로는 굉장히 좋은 성능을 보이며, 이 때문에 페이지 교체 알고리즘의 표준으로 자리잡았습니다. 반면 본문에서 소개할 알고리즘은 랜덤 알고리즘이기 때문에 필연적으로 상당한 비용을 필요로 하는 랜덤 연산(random operation)을 수행해야 합니다. 그러므로 현실적으로는 본문의 알고리즘이 LRU보다 항상 좋다고 말하기 어렵겠다는 생각이 듭니다. 다만 이론적으로는 더 좋은 것이 분명하고 이를 분석하는 것 또한 흥미롭기에 (약간 '어그로'가 있지만) 현재의 제목으로 글을 게재하였습니다. 독자분들의 너그러운 양해를 바랍니다.
문제 정의
함께 고민할 문제를 다시 한 번 정의해 보겠습니다. 우리에게는 최대
-페이즈와 마킹 알고리즘
이전 포스트에서는 위 문제를
이 알고리즘을 이해하기 위해서는 우선
이제 마킹 알고리즘을 소개하겠습니다. 알고리즘이 이전과는 다른 방식으로 기술되었습니다. 이전에는 모든 페이지마다
알고리즘 1. 마킹 알고리즘 (Marking algorithm)
초기 입력: 캐시 메모리 크기
출력: 호출된 모든 페이지를 그때마다 캐시 메모리에 올려 두는 전략
- 매
번째 시각에 페이지 가 호출되면 아래를 수행한다.- 만약
가 캐시 메모리에 이미 존재하면 아무것도 하지 않는다. - 만약 캐시 메모리에 빈 공간이 있으면 거기에
를 기록하고 그것의 비트를 올린다. - 만약
가 캐시 메모리에 존재하지 않으면서 빈 공간도 없으면 아래를 수행한다.- 만약 이 페이지가 어떤
-페이즈의 시작이면, 캐시 메모리의 모든 비트를 내린다. 비트가 내려간 페이지를 하나 찾는다. 만약 여러 개 존재하면 아무거나 고른다.- 앞에서 고른 페이지가 저장된 공간에
를 기록하고 그것의 비트를 올린다.
- 만약 이 페이지가 어떤
- 만약
위 알고리즘은 올바르게 동작합니다. 크게 두 가지를 보이면 됩니다. 하나는 단계 1-c-i에서 호출된 페이지가 어떤
정리 1. 마킹 알고리즘의 정확성
매
[증명] 만약
랜덤 마킹 알고리즘
마킹 알고리즘은 간단하지만 결정적인 단점이 있습니다. 바로 결정론적(deterministic)이라는 점입니다. 특히 마킹 알고리즘은 단계 1-c-ii에서
2020.03.14 - [온라인 알고리즘/Basic] - 온라인 알고리즘 (Online Algorithm)
온라인 알고리즘 (Online Algorithm)
일전에 유명한 온라인 문제 중 하나인 online bipartite matching을 다룬 적이 있었습니다. 당시에는 제 지식이 그렇게 깊지 않아서 제대로 설명하지 못했을뿐더러 잘못 전달한 내용도 있었습니다. 최
gazelle-and-cs.tistory.com
그러한 적응형 상대방을 만드는 방법에 대해서는 생략하도록 하겠습니다. 한번 직접 해 보시는 것을 추천합니다.
어떻게 하면 더 좋은 알고리즘을 만들 수 있을까요?
알고리즘 2. 랜덤 마킹 알고리즘 (Randomized marking algorithm)
초기 입력: 캐시 메모리 크기
출력: 호출된 모든 페이지를 그때마다 캐시 메모리에 올려 두는 전략
- 매
번째 시각에 페이지 가 호출되면 아래를 수행한다.- 만약
가 캐시 메모리에 이미 존재하면 아무것도 하지 않는다. - 만약 캐시 메모리에 빈 공간이 있으면 거기에
를 기록하고 그것의 비트를 올린다. - 만약
가 캐시 메모리에 존재하지 않으면서 빈 공간도 없으면 아래를 수행한다.- 만약 이 페이지가 어떤
-페이즈의 시작이면, 캐시 메모리의 모든 비트를 내린다. 비트가 내려간 페이지를 하나 찾는다. 만약 여러 개 존재하면 균등한 확률로 하나를 고른다.- 앞에서 고른 페이지가 저장된 공간에
를 기록하고 그것의 비트를 올린다.
- 만약 이 페이지가 어떤
- 만약
이 알고리즘이 곧 이번 포스트에서 제가 분석하고자 하는 알고리즘입니다. 이 알고리즘은 알고리즘 1에서 임의로 선택하던 것을 균등한 확률로 선택하는 것으로 바꿨을 뿐이므로 알고리즘 1의 하나의 구현에 해당합니다. 따라서 정리 1에 의해 알고리즘 2가 정확하게 동작한다는 사실은 쉽게 이끌어 낼 수 있습니다.
랜덤 마킹 알고리즘 경쟁성 분석
이제 이 알고리즘의 경쟁성을 분석해 보겠습니다. 이를 위해서 몇 가지를 정의하겠습니다.
는 주어지는 입력의 -페이즈의 총 개수입니다. 총 페이지의 수가 아님을 주의하세요. 일반성을 잃지 않고 라고 하겠습니다. 의 경우는 위 알고리즘이 캐시 미스를 일으키지 않습니다.- 주어지는 입력을 최적으로 해결하는(즉, 가장 적은 횟수로 캐시 메모리를 수정하는) 어떤 알고리즘을 하나 고정하겠습니다. 이때
는 이 알고리즘이 캐시 메모리를 수정한 총 횟수라고 하겠습니다. 각 에 대해, 이 알고리즘이 번째 -페이즈에서 수정한 횟수를 라고 부르겠습니다. 최적의 알고리즘을 하나 고정했으므로 이 값은 고정된 값이며, 를 만족합니다. - 알고리즘 2가 캐시 메모리를 수정한 총 횟수를
라고 하겠습니다. 위 항목과 비슷하게, 각 에 대해, 알고리즘 2가 번째 -페이즈에서 수정한 횟수를 라고 부르겠습니다. 이 값들은 모두 단계 1-c-ii에 의해 값이 변할 수 있는 확률 변수(random variable)입니다. 다만 를 만족한다는 것을 확인하시기 바랍니다. - 각
에 대해, 번째 -페이즈에서 등장하는 서로 다른 페이지의 집합을 라고 부르겠습니다. 예를 들어, 앞에서 소개한 에 대해서는 가 됩니다. 일부러 순서를 고려하여 적었습니다. 의 페이지가 등장한 순서가 아래에서 중요하게 쓰이기 때문입니다. - 첫 번째를 제외한
번째 -페이즈에서 호출된 어떤 페이지 가 이전 번째 -페이즈에서도 호출된 경우라면(즉, ), 이 페이지를 오래된 페이지(stale page)라고 부르겠습니다. 반대로 직전 -페이즈에서 호출되지 않았다면(즉, ), 이 페이지를 새로운 페이지(clean page)라고 부르겠습니다. - 어떤 자연수
에 대해, 를 번째 조화수(harmonic number)라고 합니다. 그 정의는 입니다. 임은 잘 알려진 사실입니다.
다음은 최적의 알고리즘이 적어도 몇 번의 수정을 수행해야 하는가에 관한 정리입니다.
정리 2. 최적해의 하한
[증명] 각
위 정리가 요긴한 이유는 알고리즘 2의 경쟁비를 구할 때 실제
정리 3. 각 -페이즈의 기대 수정 횟수
각
이 정리의 증명이 이번 글의 핵심입니다. 다만, 이는 약간 미루겠습니다. 대신, 정리 3이 참이라면 정리 2와 함께 알고리즘 2의 경쟁성을 증명할 수 있다는 것을 먼저 보이겠습니다.
정리 4. 알고리즘 2의 경쟁비
알고리즘 2는 랜덤
[증명] 지금까지 확인한 정보를 토대로 아래 식을 유도할 수 있습니다.
정리 3 증명
증명을 위해
이번
정리 5. 최악의 상황
이번
[증명] 만약
경우 1.
경우 2.
반대로 이번에는
이제
먼저 모든
이제 연관 지은
이를 모두 종합하면
위 정리를 통해 우리는
정리 6. 각 오래된 페이지가 캐시 미스를 일으킬 확률
정리 5를 가정했을 때, 각
[증명] 알고리즘이
이 확률 시행에는 한 가지 특이한 점이 있습니다. 언젠간
그러므로 우리의 목표는 위 확률 시행에서
이제 정리 3을 증명할 수 있습니다. 정리 5에 의해 캐시 미스가 평균적으로 가장 많이 발생하는 때는 처음에 새로운 페이지가 몰아서 나오는 경우입니다. 정리 6과 기댓값의 선형성에 의해
마치며
이상으로 온라인 캐싱 문제에 대해
최근 온라인 캐싱 문제에 대해 다시 공부를 하게 되었습니다. 예측 모델이 딸린 온라인 문제가 요새 제가 눈여겨 보고 있는 분야이기 때문입니다. 그러다 문득 저번에 작성하다가 그만둔 이 글이 기억났습니다. 증명을 다시 시도해 봤고, 이번에는 웬걸 훨씬 쉽게 증명에 성공하였습니다. 역시 문제가 잘 풀리지 않을 때에는 잠시 멀리 떨어질 필요가 있나 봅니다.
시간이 된다면 예측 모델이 딸린 온라인 캐싱 문제에 대해서 공부한 다음 정리해 보도록 하겠습니다. 비슷한 모델을 스키 대여 문제에서 푼 것은 이미 제 블로그에 정리하여 두었습니다. 궁금하시면 아래 글을 참고하시기 바랍니다.
예측이 있는 스키 대여 문제 (Ski Rental Problem with Predictions)
온라인 문제(online problem)의 대표격인 스키 대여 문제(ski rental problem)는 지난 수십 년간 깊이 그리고 널리 연구되어 온 매우 유서 깊은 문제입니다. 제 블로그에서도 비중 있게 다룬 적이 있는데요
gazelle-and-cs.tistory.com
읽어 주셔서 고맙습니다.
참고 문헌
[1] Amos Fiat, Richard M. Karp, Michael Luby, Lyle A. McGeoch, Daniel D. Sleator, and Neal E. Young. "Competitive paging algorithms." Journal of Algorithms 12, no. 4 (1991): 685-699.
주석
[ㄱ]
'온라인 알고리즘 > Caching' 카테고리의 다른 글
최적 페이지 교체 알고리즘 (Optimal Page Replacement Algorithm) (0) | 2023.03.25 |
---|---|
[캐싱 / Caching] LRU는 얼마나 좋은 알고리즘일까? (0) | 2020.04.04 |