[31일차] | 컴퓨터 밑바닥의 비밀 | 책너두

Heechan Kang·2024년 5월 19일
0
post-thumbnail

Chapter 5. 작은 것으로 큰 성과 이루기, 캐시

  • 현대의 컴퓨터도 기본적으로는 폰 노이만 구조를 따른다.
    • CPU는 명령어를 실행하고, 명령어는 메모리에서 읽어들인다.
  • 즉, CPU는 메모리와 빈번하게 상호작용을 해야 한다.

5.1 캐시, 어디에나 존재하는 것

5.1.1 CPU와 메모리의 속도 차이

  • 시스템의 작동 속도는 그 구성요소들 중 가장 느린 것에 의해 결정된다.
    • 하지만 현대의 메모리는 CPU에 비해 약 1/100수준의 느린 속도를 가진다.

5.1.2 도서관, 책상, 캐시

  • 도서관에서 자료를 찾을 때, 필요한 책들을 책상에 찾아두고 작업을 하는 것이 효율적이다.

    • 이 때 책상이 캐시의 역할을 하고, 서가는 메모리라고 할 수 있다.
  • 이처럼 실제 컴퓨터에서도 CPU와 메모리 사이에 캐시를 두어 성능을 향상시킨다.

    • x86 CPU의 경우, L1, L2, L3 캐시가 있다.
      • L1캐시는 약 4클럭 주기로 작동하여 레지스터와 비슷한 속도지만 저장 공간이 작다.
      • L2캐시는 약 10클럭 주기, 중간 저장 공간을 가지고 있다.
      • L3캐시는 약 50클럭 주기, 큰 저장 공간을 가지고 있다.
  • CPU는 필요한 데이터가 있으면 먼저 L1, L2, L3 캐시를 순서대로 확인한다.

    • 캐시에 데이터가 있다면, CPU는 캐시에서 데이터를 읽어들인다. 이를 캐시 히트라고 한다.
    • 만약 캐시에 데이터가 없다면, 메모리에서 데이터를 새로 읽어들인다.
      • 이 때 캐시에 데이터를 다시 저장하는 것을 캐시 미스라고 한다.

5.1.3 공짜 점심은 없다: 캐시 갱신

  • CPU가 메모리에 직접 접근하는 대신 캐시에 접근함으로써 성능이 향상된다.

  • 그러나 데이터를 쓰는 과정에서 문제점이 발생한다.

    • 캐시의 데이터가 수정되었지만, 메모리의 데이터를 수정되지 않는 불일치(inconsistency)가 발생한다.
  • 가장 간단한 해결방법은 연속 기입(write-through)이다.

    • 이 방법은 캐시에 데이터를 쓸 때, 동시에 메모리에도 데이터를 쓰는 방법이다.
    • 이 방법은 캐시와 메모리의 일관성을 유지할 수 있지만, 쓰기 속도가 느려진다.
      • 동기 작업으로, 메모리에 데이터를 쓰는 작업이 끝날 때까지 기다려야 하기 때문이다.
  • 이를 비동기로 처리하는 후기입(write-back) 방법이 있다.

    • 이 방법은 캐시에 데이터를 쓸 때, 메모리에 데이터를 즉시 쓰지 않고, 캐시에만 데이터를 쓴다.
    • 이후 캐시를 갱신하는 과정에서 데이터가 수정된적 있다면, 메모리에 데이터를 쓴다.
    • 보다 구현이 복잡하지만 성능이 더 좋다.

5.1.4 세상에 공짜 저녁은 없다: 다중 코어 캐시의 일관성

  • CPU가 여러 개의 코어를 가지고 있을 때, 여러 코어의 캐시에 각각 데이터가 저장되어 있을 수 있다.
  • 이 때 각 코어의 캐시가 일관성을 유지하지 못하는 문제가 발생한다.
    • 이를 해결하기 위해 MESI(Modified, Exclusive, Shared, Invalid) 프로토콜이 등장한다.

5.1.5 메모리를 디스크의 캐시로 활용하기

  • 메모리가 CPU에 비해 느리긴 하지만, 디스크에 비해는 매우 빠르다.
  • 또한 메모리는 일반적으로 100% 사용되지 않으므로, 이를 디스크의 캐시로 활용할 수 있다.
    • 리눅스에서 페이지 캐시(page cache)는 이러한 역할을 한다.
  • 최근에는 캐시를 넘어서서 메모리가 디스크의 역할을 하는 경우도 늘어나고 있다.
    • 최근 저렴해지는 메모리의 가격으로 인해 이러한 추세가 더욱 두드러지고 있다.

5.1.6 가상 메모리와 디스크

  • 이미 메모리가 모두 할당되어있는 상황에서 새로운 프로세스가 생성되는 경우, 가상 메모리를 통해 이를 해결할 수 있다.
    • 새로운 할당 요청이 들어왔을 때, 메모리에서 자주 사용되지 않는 데이터를 디스크로 내보내고, 새로운 데이터를 메모리에 할당한다.
    • 이 방식으로 메모리를 효율적으로 사용할 수 있다.

5.1.7 CPU는 어떻게 메모리를 읽을까?

  • CPU는 데이터를 읽을 때 아래의 과정을 거치고, 고려해야 한다.
    • L1, L2, L3 캐시에 데이터가 있는지 확인한다.
    • 캐시에 데이터가 없다면, 메모리에서 데이터를 읽어들인다.
      • 가상 메모리로 인해, 사실상 데이터가 디스크에 있는 경우도 있다.

5.1.8 분산 저장 지원

  • 빅데이터의 시대가 도래하며, 데이터의 양이 기하급수적으로 증가하고 있다.
  • 이에따라 데이터를 로컬 머신 뿐 아닌 분산 저장소에 저장하는 경우도 늘어나고 있다.
    • 이러한 경우 로컬 머신이 분산 저장소에 대한 일종의 캐시 역할을 하게 된다.
    • 혹은 응답 시간을 줄이기 위해 로컬 머신에 디스크를 두지 않고, 분산 저장소에서 데이터 스트림을 받아 처리하는 경우도 있다.
profile
안녕하세요

0개의 댓글