5.8 메모리 계층구조

Bor·2021년 12월 8일
0

컴퓨터구조

목록 보기
12/15

이전장 요약s

가상 메모리는 메인 메모리와 디스크 사이의 캐싱(cashing)을 처리해주는 메모리 계층을 나타내는 이름이다. 가상 메모리는 하나의 프로그램이 메인 메모리의 한계를 넘어 주소 공간을 확장시킬 수 있도록 해준다. 더 중요한 것은 가상 메모리가 동시에 활성화된 다수의 프로세스들이 서로 보호인 상태에서 메인 메모리를 고유할 수 있도록 한다는 것이다.

메인 메모리와 디스크 사이의 메모리 계층 구조를 관리하는 것은 페이지 부재의 높은 비용 때문에 쉽지 않다. 실패율을 줄이기 위해 여러 기법들이 사용된다

    1. 페이지들은 공간적 지역성을 이용하고 실패율을 줄이기 위해 크게 만들어진다.
    1. 페이지 테이블로 구현된 가상 주소와 실제 주소의 사상을 완전 연관 방식으로 구현하여 가상 페이지를 메인 메모리 내 어느 곳에나 적재 시킬 수 있게 한다
    1. 운영체제는 교체될 페이지를 선정하기 위해 LRU와 참조 비트와 같은 기법을 사용한다

디스크로 쓰기에는 시간이 많이 걸린다. 그래서 가상 메모리는 나중 쓰기 기법을 사용하며, 변화되지 않은 페이지를 디스크에 저장하는 것을 피하기 위해 페이지의 변화여부 (갱신 비트로)조사한다

가상 메모리 시스템은 프로그램에 의해 사용되는 가상 주소를 메모리 접근에 사용되는 시레 주소공간으로 주소 변환한다. 이 주소 변환은 메인 메모리의 보호된 공유를 허락하고 메모리 할당을 단순화하는 것과 같은 추가적인 기능을 제공한다. 프로세스들이 서로 보호되는 것을 보장하기 위해서는 단지 운영체제만이 주소 변환을 변경할 수 있어야 한다. 이는 사용자 프로그램이 페이지 테이블을 변경하지 못하게 함으로써 구현될 수 있다. 프로세스들 사이의 통제된 페이지 공유는 운영체제와 사용자 프로그램이 페이지에 읽기와 쓰기 접근 권한을 갖고 있는지 여부를 말해주는 페이지 테이블 접근 비트의 도움으로 가능하다.

만약 프로세서가 모든 주소 변환을 위해 메모리 내에 있는 페이지 테이블에 접근해야만 한단면 가상 메모리는 너무나 큰 부담. 대신 TLB가 페이지 테이블 변환을 위한 캐시 기능을 한다. 그래서 각 주소는 TLB 내 변환을 가지고 가상 주소에서 실제 주소로 변환. 캐시, 가상, 메모리, TLB 모두 공통되는 원칙과 정책에 의존. 다음절은 이 공통프레임워크에 대해 설명한다.

프로그램 성능의 이해
가상 메모리가 작은 메모리를 큰 것처럼 활용할 수 있도록 개발되었음에도 불구. 실제 메모리보다 더 많이 가상 메모리에 접근하면 디스크와 메모리 성능 차이로 인해 매우느려짐. 이와 가은 프로그램은 메모리와 디스크 사이에서 끊임없이 페이지를 교체하게 되는 스래싱(Thrashing)이 발생한다. 자주 발생하지 않지만 발생하면 손실이 매우 크다. 가장 쉬운 방법은 메모리를 보완 or 더 큰 메모리를 갖는 컴퓨터 이용. 알고리즘과 자료구조를 점검해 지역성을 바꿔 프로그램이 동시에 사용하는 페이지를 줄이는 방법도. 이와 같은 페이지의 집합들을 비공식적으로 워크셋이라고 부른다.


메모리 계층을 위한 공통 구조

이제까지 다른 종류의 메모리 계층이 상당 부분 고옹점을 갖는다는 것을 알았다. 메모리 계층의 많은 부분들이 정량적으로는 다를지라도 어떻게 계층의 정량적 특징이 다를지라도 어떻게 계층이 동작하는지를 결정하는 원칙과 특징들은 정성적으로 유사. 메모리 게층의 어떤 두 계층 간에도 적용될 수 있는 일련의 네 질문으로 원칙을 조사해보자.

질문1: 블록을 어디에 위치시킬 수 있는가?

메모리 계층구조의 상위 수준에 블록을 위치시키기 위해서는 직접 사상, 집합 연관, 완전 연관 등과 같은 방식을 사용할 수 있음을 살펴봤다. 위에서 언급한 바와 같이 이런 다양한 방법들은 집합 수와 집합당 블록의 수의 변화에 따른 집합 연관 방식의 변형으로 생각할 수 있다

방식집합의 수집합당 블록의 수
직접 사상캐시의 블록 수1
집합 사상캐시 내의 블록 수 / 연관정도연관정도
완전 연관1캐시내 블록의 수

연관 정도를 증가시키는 것의 장점은 일반적으로 실패율을 감소시킨다는 것이다. 실패율의 향상은 같은 위치에 대한 충돌을 줄임으로써 가능하다. 곧 이 둘의 차이에 대해서 봄. 먼저 얼마나 큰 향상을 얻을 수 있는지 보자. 아래 그래프에서 가장 큰 이득은 직접 사상을 2-way 집합 연관 방식으로 바꾸면서 가능했고, 실팽ㄹ 20% 내지 30%를 줄일 수 있었다. 캐시가 커짐에 따라 연관 정도의 의한 상대적인 성능 향상은 줄어든다. 큰 캐시에서는 전체 실패율이 낮으므로, 실패율을 향상시킬 수 있는 기회는 줄어들게 되고 연관에 의한 실패율의 절대적인 향상이 크게 위축. 이미 언급했지만 연관 정도의 잠재적 단점은 증가된 비용과 느려진 접근 시간이다.


질문 2: 블록을 어떻게 찾는가?

블록은 어떻게 찾느냐는 블록 배치 방식에 의존한다. 블록 배치 방식이 가능한 위치의 수를 말해주기 때문. 다음과 같이 배치 방식을 요약할 수 있다.

연관 정도위치파악 방법비교 횟수
직접 사상인덱스1
집합 사상집합 인덱스, 집합 내 모든 원소 비교연관정도
완전 연관모른 엔트리 검색/ 별도의 참조 테이블 사용캐시의 크기 / 0

모든 메모리 계층에서 직접 사상, 집합 연관 방식, 완전 연관 방식 중 하나를 선택하는 것은 연관 정도의 구현 비용과 실패비용에 따라 결정된다. 비용은 시간과 추가 하드웨얼르 계산한다. 칩 상의 L2 캐시는 적중 시간이 크게 중요하지 않고 설계자가 빌딩 블록으로 표준 SRAM 을 사용하지 않으므로 더 높은 연관 정도를 구현할 수 있게 해준다. 완전 연관 방식은 작은 크기를 제외하고는 사용하지 않아야 한다. 작은 캐시에서는 비교기 비용이 크지 않으면서 절재 실패율 향상은 크기 때문에 써볼만 하다.

가상 메모리 시스템에서는 메모리를 인덱스 하기 위해 별도의 사상 테이블(페이지 테이블)을 사용한다. 인덱스 테이블을 사용하면 테이블을 저장할 공간이 필요할 뿐만 아니라 추가 메모리 접근이 필요하다. 다음 사실 때문에 가상 메모리는 페이지 배치에 완전 연관 방식을 사용하고 별도의 인덱스 테이블을 갖는 완전 연관 방식을 사용.

  1. 실패에 따르는 손실이 크기 때문에 완전 연관 방식이 이롭다.
  2. 완전 연관 방식은 실패율을 줄이기 위해 설계한 정교한 교체 방식을 소프트웨어가 사용할 수 있도록 한다.
  3. 완전한 사상 테이블이 있기 때문에 추가 하드웨어와 검색 과정없이 쉽게 인덱스 된다.

그래서 가상 메모리 시스템은 항상 완전 연관 배치 방식을 사용한다.

집합 연관 배치는 캐시와 TLB에 종종 쓰이며, 접근은 인덱스와 선택된 작은 집합 내의 검색을 포함한다. 몇몇 시스템들을 간단함과 접근 시간의 이점으로 인해서 직접 사상 캐시를 이용. 접근 시간의 이점은 요청된 블록을 찾는 데 비교가 필요 없기 때문에 생긴다. 이와 같은 설계에서의 선택은 캐시의 온칩 여부, 캐시를 구현하는데 사용한 기술, 그리고 프로세서 사이클 시간을 결정하는 데 있어 캐시 접근 시간의 핵심적인 역할 등과 같은 구현상의 많은 요소들에 의존한다.


질문 3: 캐시 실패 시 어느 블록을 교체시키는가?

연관 방식 캐시에서 실패 발생 시, 어느 블록을 교체 시킬 것인가 결정해야 한다. 완전 연관 캐시에서는 모든 블록이 교체 후보가 된다. 만약 캐시가 집합 연관 방식이라면, 선정된 집합 내의 블록 중에서 선정해야 한다. 물론 직접 사상 방식에서는 오직 하나의 후보만이 존재하므로 선정이 쉽다.

이미 집합 연관과 완전 연관 캐시에서 교체를 위한 두 가지 전략을 살펴봤다.

  • 임의 교체 : 후보 블록이 경우에 따라 하드웨어의 지원을 받아서 임의로 선정된다. 예를 들어 MIPS는 TLB 실패 시 임의 교체 방식을 사용ㅎ나다.
  • LRU 교체 : 가장 오랜 시간 동안 사용되지 않은 블록을 선정한다.

실제로 약간의 연관 정도 이상을 갖는 계층구조에서 LRU를 구현하는 것은 블록의 사용 정보를 추적하는 비용이 많이 들어 어렵다. 큰 연관 방식에서는 LRU의 근사 방식을 이용하거나 임의 교체 방식을 이용한다. 캐시에서는 교체가 하드웨어로 이뤄지므로 구현하기 쉬워야 한다. 임의 교체 방식은 하드웨어로 간단히 구현될 수 있다. 캐시의 크기가 점점 커지면, 이 두 교체 방식은 실패율은 줄어들고 두 값의 절대적인 차이도 작아진다. 실제로 임의 교체 방식은 하드웨어로 쉽게 구현할 수 있는 LRU 근사 방식보다도 때로는 더 좋다.

가상 메모리에선 실패 비용이 매우 커서 실패율의 작은 감소조차 중요. 항상 LRU 근사 방식이 사용된다. 운영체제가 가장 오래전에 사용한 페이지를 쉽게 추적할 수 있도록 하기 위해, 참조 비트 또는 이와 유사한 기능이 종종 제공된다. 실패는 비용이 많이 들고 상대적으로 드물게 발생하기 때문에, 주로 소프트웨어를 사용해 이 정보를 근사화 하는 것이 가능하다.


질문 4: 쓰기 시에는 어떤 일이 발생하는가?

모든 메모리 계층의 중요한 특징은 쓰기를 어떻게 수행하는가에 있따. 다음 두가지 방식에 관해서는 이미 살펴봤다.

  • 즉시 쓰기 : 정보가 캐시 내의 블록과 계층의 하위 수준(캐시의 경우 메인 메모리)의 블록 양쪽에 저장된다.
  • 나중 쓰기 정보가 캐시 내의 블록에만 저장된다. 수정된 블록은 교체할 때만 하위 수준으로 저장된다. 가상 메모리는 항상 이 방법을 사용.

두 가지 방법 모두 장점이 있지만, 나중 쓰기의 주요 장점은 아래와 같다

나중 쓰기의 장점

  • 각각의 워드는 프로세서에 의해 메인 메모리가 아닌 캐시가 받아들일 수 있는 속도로 쓰인다
  • 다수의 쓰기가 행해진 블록을 계층의 하위 계층에 한 번만 쓰면 된다.
  • 블록들이 하위 수준에 쓰일 때, 전체 블록을 한꺼번에 쓰기 때문에 높은 대역폭을 효과적으로 사용가능

즉시 쓰기의 장점

  • 실패가 발생해도 하위 수준에 블록을 쓸 필요가 없기 때문에 간단하고 비용이 적게 든다.
  • 즉시 쓰기는 나중 쓰기보다 구현이 간단하다. 하지만 실제로 즉시 쓰기는 쓰기 버퍼를 요구한다.

가상 메모리 시스템에서는 계층의 하위수준(디스크)에 쓰기를 수행할 때 매우 큰 지연 시간을 발생시키기에 나중 쓰기 방식이 유일한 실용적 대안. 프로세서에서 발생하는 쓰기 비율은 논리적으로 또는 물리적으로 대역폭이 큰 메인 메모리를 사용하고 DRAM의 버스트 모드를 사용하더라도 메모리 시스템이 처리하는 비율보다 크다. 결과적으로 오늘날 하위 계층의 캐시들이 나중 쓰기 방식을 사용하고 있다.


3C : 메모리 계층의 행동을 이해하기 위한 직관적 모델

이 절에서는 메모리 계층 구조 내에서 발생하는 실패의 원인을 쉽게 설명해주는 모델을 살펴보고 계층 내의 변화에 의해 이 실패가 어떻게 영향을 받는지에 대해 설명한다. 이런 원인과 영향은 계층 구조 내 모든 수준에서 적용되지만 캐시를 이용해서 설명하고자 한다. 이 모델에서는 모든 실패가 다음 세 가지 중 하나로 분류될 수 있다.

  • 필수 실패(compulsory miss) : 최초시작 실패라고도 불린다. 캐시에 없는 블록에 처음으로 생기는 캐시 실패.

    필수 실패는 블록의 맨 처음 참조에 의해 발생되기에 필수 실패의 수를 줄이기 위한 주요 방법은 블록의 크기를 늘리는 것이다. 이는 프로그램의 모든 블록을 한 번씩 참조하는 데 필요한 접근 횟수를 줄일 수 있다. 왜냐하면 프로그램은 훨씬 더 작은 캐시 블록들로 이뤄질 수 있기 때문. 이미 언급한 바와 같이 블록의 크기를 너무 크게 하면 실패 손실의 증가 때문에 성능에 나쁜 영향을 줄 수 있다.

  • 용량 실패(capacity miss) : 완전 연관 방식을 채택한 캐시에서도 요청을 만족시키는 데 필요한 모든 블록을 갖고 있을 수 없기 때문에 발생하는 캐시 실패.

    캐시의 크기를 크게 해서 줄일 수 있다. 실제로 최근 수년동안 2차 캐시의 크기는 꾸준하게 커지고 있다. 물론 캐시를 크게 함으로써 접근 시간이 늘어나게 되고 전체 성능을 저하시킨다는 것에 주의. 따라서 1차 캐시의 크기는 느리게 발전.

  • 대립 실패(conflict miss) : 이것은 집합 연관이나 직접 사상 캐시에서 다수의 블록들이 하나의 집합에 대해서 경쟁을 벌일 때 생기는 캐시 실패. 같은 크기를 갖는완전 연관 캐시에서는 발생하지 않는다. 이를 충돌 실패라고도 부른다.

    대립 실패는 같은 캐시 블록으로의 사상 경쟁에서 발생되기 때문에, 연관 정도를 높임으로써 줄일 수 있다. 그러나 연관 정도의 증가는 접근 시간을 느리게 해서 전체 성능을 저하시킨다.

0개의 댓글