가장 효율적인 캐시 교체 알고리즘 [닫기]


12

Wikipedia에는 ​​11 개의 캐시 교체 알고리즘이 나와 있습니다. 개발할 애플리케이션에 대해 거의 아무것도 모른다고 가정하면 "기본"캐시 교체 알고리즘으로 무엇을 사용해야합니까?

OS 과정에서 올바르게 기억한다면 LRU가 가장 일반적인 캐시 교체 알고리즘입니다. 하지만 내가 틀렸을 수도 있습니다.

또한 이것은 일반적으로 주 메모리가 저렴하고 풍부하기 때문에 캐시 크기에 대해 너무 걱정할 필요가 없기 때문에 약간의 학문적 인 질문입니다.


1
프리 페칭은 애플리케이션과 관련이 있습니까? 그렇다면 알고리즘을 선택할 때 프리 페치 및 유지 전략을 함께 고려해야합니다.
rwong

원하는 응용 프로그램 도메인을 나타내는 샘플 추적 (데이터 액세스 패턴 목록)을 가져와야합니다. 학술 연구에서 공개적으로 사용 가능한 테스트 세트를 찾을 수 있습니다. 그런 다음 각 알고리즘을 구현하고 시뮬레이션을 수행하고 결과를보고 할 수 있습니다. 실패하면 무작위로 교체하는 LRU를 사용하십시오.
rwong

1
당신은 "응용 프로그램에 대해 거의 아무것도 몰라"있다면 그건 지금까지 "효율적"캐시 교체 알고리즘에 대해 생각하는 초기에.
Anon

메인 메모리는 저렴하지만 성능이 중요한 문제라면 액세스 효율성이 중요합니다. 새 컴퓨터의 수석 설계자가 아닌 한 캐시 교체 전략을 선택할 수 있다고 생각하지 않습니다. 우리 중 나머지는 시장이 제공하는 모든 것을 얻습니다. 빠르게 진행해야하는 경우 메모리 계층 구조를 효율적으로 사용하려면 계산 및 데이터 구조를 구성해야합니다.
Omega Centauri

1
@Omega Centauri CPU 캐시 만 생각하지만 훨씬 더 많습니다. OS는 사용 된 파일과 디렉토리를 캐시하고 데이터베이스는 데이터를 캐시하며 거의 각 응용 프로그램은 많은 캐싱을 수행합니다 (예 : 이미 계산 된 결과).
maaartinus

답변:


15

가장 좋은 대답은 그것이 달려 있다는 것입니다. 내 경험에는 캐싱 알고리즘을 선택하는 데 많은 요소가 있습니다.

고려해야 할 요소

  1. 읽기 / 쓰기 밸런스. (읽기 대 쓰기의 몇 퍼센트 액세스)
  2. 캐시 양.
  3. 캐시 뒤의 미디어 유형. (SATA 드라이브가 느리거나 SSD 드라이브가 빠릅니까?)
  4. 조회수 대 미스. (얼마나 자주 다시 쓰거나 다시 읽습니까?)
  5. 평균 액세스 크기 (페이지 크기를 선택합니다)
  6. 읽고 쓰는 데 비용이 얼마나 듭니까?

모든 다른 요소를 고려한 후에는이를 가장 잘 처리하는 캐시 알고리즘을 찾아야합니다. 예를 들어 많은 쓰기, 일부 다시 쓰기, 최근에 쓴 데이터 읽기 및 일종의 회전 미디어가있는 응용 프로그램이 있다고 가정합니다. 이 경우 일종의 하이브리드 캐싱 알고리즘이 필요합니다. 쓰기 데이터를 처리하려면 WOW (Wise order of Writes) 및 디스크에서 읽은 데이터에 대한 LRU 알고리즘과 같은 것이 필요할 수 있습니다. 그 이유는 디스크 액세스 비용이 매우 비싸고 WOW 알고리즘을 사용하면 데이터를보다 효율적으로 쓸 수 있고 LRU는 자주 액세스하는 데이터를 항상 캐시에 보관하기 때문입니다.

매우 빠른 액세스 시간을 갖는 SSD 디스크가 있다고 가정하면 디스크 액세스가 비교적 저렴하기 때문에 LRU 알고리즘을 선택하는 것이 좋습니다.

정말 말하고 싶은 것은 "최고의"답변이 없다는 것입니다. 가장 좋은 대답은 자신에게 적용되는 요소를 알고이를 처리하는 알고리즘을 선택하는 것입니다.

알고리즘을 찾는 방법

시스템을 프로파일하십시오. 일반적으로 메모리 액세스에 대한 통계를 유지하는 코드를 추가해야합니다. 프로파일 링을 통해 가장 중요한 요소를 확인할 수 있습니다.

과거에는 일정 기간 동안 모든 메모리 액세스를 추적하는 코드를 추가했습니다. 그런 다음 나중에 패턴을 찾습니다. 다시 읽기, 다시 쓰기, 순차적 액세스, 임의 액세스 등을 찾습니다.

중요한 것을 식별 한 후에는 어떤 유형의 처리가 가장 적합한 지 확인하기 위해 모든 다른 유형의 캐싱 알고리즘을 살펴 봐야합니다.


요인의 큰 고장. 그러나 응용 프로그램 도메인과 요소를 알고 있다면 적용 방법을 잘 모르겠습니다.
ashes999

@ashes : 오래된 엔지니어링 기술이 있습니다. 몇 가지 방법으로 빌드하고 가장 적합한 방법을 측정하십시오.
Donal Fellows

"캐시"가 들리면 메모리와 CPU 레지스터 사이의 저장소를 생각합니다. 여기에서는 메모리와 하나 이상의 i / o 장치 사이의 계층 인 디스크 캐시에 대해 설명합니다.
Omega Centauri

@ barrem23 분산 프로그래밍을 수행하는 경우 "캐시와 백엔드 스토리지 사이의 거리"도 고려해야합니다. 스토리지가 15ms 떨어져있는 경우 SSD가 안정적이고 크고 안정적인 스토리지로 사용되는 경우 중요하지 않습니다. 어쨌든 항상 최소 30ms의 왕복이 발생합니다.
Vatine

9

개발하려는 애플리케이션에 대해 거의 아무것도 모른다고 가정하면 실제로 캐시 시스템을 선택하고 구현하기 전에 이에 대해 더 많이 알아야합니다. 다시 말해서, 기본 구현은 없습니다 : 일부는 어떤 목적에는 좋고 다른 것은 전혀 나쁩니다 .

예를 들어, Least Recent Used 및 Least Frequently Used라는 두 가지 구현 만 수행하십시오. 어느 것을 먼저 사용할 것인지 결정하는 방법은 무엇입니까?

  • LRU는 사용자가 가장 최근 항목에 더 자주 액세스하고 이전 항목으로 돌아 가지 않거나 거의 반환하지 않을 것이라고 확신 할 때 좋습니다. 예 : 전자 메일 클라이언트의 일반적인 사용법. 대부분의 경우 사용자는 최신 메일에 지속적으로 액세스합니다. 그들은 읽고, 연기하고, 몇 분, 몇 시간, 며칠 후에 다시 돌아옵니다. 2 년 전에받은 메일을 검색 할 수 있지만 지난 2 시간 동안받은 메일에 액세스하는 것보다 덜 자주 발생합니다.

  • 반면에 LRU는 사용자가 일부 항목을 다른 항목보다 훨씬 자주 액세스하는 상황에서는 의미가 없습니다. 예 : 나는 좋아하는 음악을 자주 듣습니다. 400 곡에서 적어도 일주일에 한 번 같은 5 곡을들을 수 있지만, 매년 100 번까지 좋아하지 않습니다. 많은. 이 경우 LFU가 훨씬 더 적합합니다.

두 가지 구현 만 수행하면 어느 것이 더 나은지 또는 응용 프로그램에 대한 충분한 정보가 없는지에 대해 생각하고 싶지 않을 때 사용할 수있는 "기본"알고리즘이 없다는 것을 알 수 있습니다. 그것은 기본적으로, 당신이 그것에 대해 아무것도 모르는 경우 미적분학의 결과를 찾기 위해 두 숫자를 더하거나 빼거나 곱하거나 나눠야하는지 묻는 것과 같습니다.


좋아, 알고리즘을 선택하는 방법은 무엇입니까? Wikipedia의 목록을 살펴보고 무엇이 가장 적합한 지 확인하십시오.
ashes999

@ ashes999 : 정확히! 먼저, 애플리케이션의 요구 사항에 대해 자세히 학습 한 후 다양한 캐시 알고리즘의 장단점을 분석하고 마지막으로 더 적합한 알고리즘을 선택합니다.
Arseni Mourzenko

3

위키 백과로만 선택을 제한해야하는 이유는 무엇입니까? ACM Digital Library 와 같은 리서치 데이터베이스에 액세스하면 더 많은 알고리즘을 찾을 수 있습니다. 또한 특허를 어지럽히는 것에 대해서도 알고 있어야합니다. 예를 들어 ARC는 좋은 알고리즘이지만 불행히도 특허를 받았습니다.


2

'최상의'알고리즘에 대해 많은 시간을 소비하거나 간단한 알고리즘을 구현하고 시스템의 나머지 부분을 가져옵니다. 당신이 뭔가를 테스트 할 수있을 때 다음 알고리즘에 대해 우려하고있다.

조기 최적화 ...


0

완벽한 캐시 알고리즘은 없습니다. 항상 매우 잘못 작동하는 사례를 찾을 수 있습니다.

따라서 가장 나쁜 동작을 결정하기 위해 캐시되는 문제를 아는 것이 중요합니다.

또한 캐시 하는 데 필요한 시간과 캐시 할 수있는 시간을 고려해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.