검색
회원가입로그인
AI와 함께 공부하기 : 컴퓨터 구조

Memory: Virtual Memory

가상 메모리(Virtual Memory)란?

가상 메모리는 컴퓨터의 주 메모리(RAM) 용량을 넘어서는 프로그램을 실행할 수 있도록 하는 기술입니다. 주 메모리를 보조 저장 장치(예: 하드 디스크)의 '캐시'처럼 사용하는 기법이라고 할 수 있습니다. 이는 CPU 하드웨어와 운영체제(OS)가 함께 관리합니다.

목표 및 목적:

가상 메모리의 주된 목적은 주 메모리의 용량을 확장하여 더 큰 프로그램이나 여러 프로그램을 동시에 실행할 수 있게 하는 것입니다. 예를 들어, 메인 메모리가 4GB인데 6GB짜리 프로그램을 실행해야 할 때, 가상 메모리 기술이 없다면 불가능합니다.

가상 메모리와 캐시 메모리의 주요 차이점

슬라이드에서 제시된 표를 바탕으로 두 개념의 차이를 명확히 구분해 보겠습니다.

특징가상 메모리 (Virtual Memory)캐시 메모리 (Cache Memory)
주된 목적주 메모리 용량 증가CPU 접근 속도 증가
본질메모리 유닛이 아닌, 기술 (Technique)실제 메모리 유닛 (Memory Unit)
크기캐시 메모리보다 큼가상 메모리보다 작음
주요 활용주 메모리보다 큰 프로그램 실행 가능최근 사용된 데이터를 복사하여 저장
관리 주체CPU 하드웨어와 운영체제가 공동 관리주로 하드웨어 자동 관리 (소프트웨어 개입 최소화)
미스 이름페이지 폴트 (Page Fault)캐시 미스 (Cache Miss)
블록 이름페이지 (Page)블록 (Block)
미스 페널티수백만 클럭 사이클 (매우 큼)10-1000 클럭 사이클 (상대적으로 작음)
쓰기 정책주로 Write-Back만 실용적Write-Through, Write-Back 모두 사용 가능
블록 교체 정책LRU 근사치 사용 (미스 페널티가 커서 중요)LRU, Random 등 사용

가상 주소와 물리 주소 (Address Translation)

가상 메모리 시스템에서 프로세서(CPU)는 가상 주소(Virtual Address)를 생성합니다. 이 가상 주소는 실제 주 메모리(RAM) 상의 물리 주소(Physical Address)로 변환되어야 합니다. 이 변환 과정을 주소 변환(Address Translation) 또는 주소 매핑(Address Mapping)이라고 합니다.

  • 가상 주소 공간 (Virtual Address Space): 각 프로그램은 자신만의 독립적인 가상 주소 공간을 가집니다. 이는 여러 프로그램이 주 메모리를 공유하면서도 서로의 데이터를 침범하지 않게 합니다.

  • 물리 주소 공간 (Physical Address Space): 실제 주 메모리(RAM)의 주소 공간입니다.

  • 페이지(Page): 가상 메모리에서 정보를 복사하는 최소 단위는 '페이지'라고 불립니다. 이는 캐시 메모리의 '블록'과 유사한 개념입니다. 일반적인 페이지 크기는 4 KB(2^12 바이트)입니다.

주소 변환 과정 (페이지 테이블 사용)

  1. 가상 주소 분할: 32비트 가상 주소는 크게 두 부분으로 나뉩니다:

    • 가상 페이지 번호 (Virtual Page Number): 가상 주소의 상위 비트 (예: 20비트).

    • 페이지 오프셋 (Page Offset): 페이지 내의 특정 바이트를 가리키는 하위 비트 (예: 12비트). 페이지 오프셋은 주소 변환 없이 물리 주소의 페이지 오프셋으로 그대로 사용됩니다.

  2. 페이지 테이블(Page Table):

    • 주소 변환을 위해 사용되는 테이블로, 메인 메모리에 저장됩니다.

    • 각 프로그램은 자신만의 페이지 테이블을 가집니다.

    • CPU 내의 **페이지 테이블 레지스터(Page Table Register)**가 현재 실행 중인 프로그램의 페이지 테이블 시작 주소를 가리킵니다.

    • 가상 페이지 번호는 페이지 테이블의 인덱스로 사용되어 해당 페이지의 정보를 찾습니다.

  3. 페이지 테이블 엔트리: 페이지 테이블의 각 엔트리에는 다음과 같은 정보가 포함됩니다.

    • 물리 페이지 번호 (Physical Page Number): 해당 가상 페이지가 주 메모리의 어느 물리 페이지에 매핑되어 있는지를 나타냅니다.

    • 유효 비트(Valid Bit): 해당 페이지가 현재 주 메모리에 로드되어 있는지(1) 디스크에 있는지(0)를 나타냅니다.

    • 더티 비트(Dirty Bit): 해당 페이지가 주 메모리에 로드된 후 내용이 수정되었는지(1) 아닌지(0)를 나타냅니다.

    • 기타 상태 비트: 접근 권한(읽기/쓰기/실행), 참조 비트(Reference bit) 등.

  4. 물리 주소 생성: 페이지 테이블에서 얻은 물리 페이지 번호와 원래 가상 주소의 페이지 오프셋을 결합하여 최종 물리 주소를 생성합니다.

페이지 폴트(Page Fault) 처리

  • 페이지 폴트 발생: CPU가 특정 가상 주소를 요청했을 때, 해당 가상 페이지의 유효 비트가 0이면(페이지가 메인 메모리에 없음) 페이지 폴트가 발생합니다.

  • 운영체제 개입: 페이지 폴트는 예외(Exception)로 처리되어 운영체제에 제어권이 넘어갑니다.

  • 처리 과정:

    1. 운영체제는 페이지 테이블 엔트리에서 해당 페이지가 디스크의 어디에 저장되어 있는지 확인합니다.

    2. 메인 메모리에 빈 페이지 프레임이 없다면, 운영체제는 교체 정책(가장 오래 사용되지 않은 페이지인 LRU를 근사하여 사용 )에 따라 희생될 물리 페이지를 선택합니다.

    3. 선택된 페이지가 더티(Dirty) 상태라면, 수정된 내용을 디스크에 먼저 기록하여 데이터를 동기화합니다. (이는 Write-Back 정책과 유사하며, 디스크 쓰기 지연 시간이 매우 길기 때문에 Write-Through는 실용적이지 않습니다 ).

    4. 디스크에서 요청된 페이지를 메인 메모리의 빈 페이지 프레임으로 로드합니다. 이 과정은 수백만 클럭 사이클이 소요될 수 있어 매우 느립니다.

    5. 페이지 테이블 엔트리를 업데이트하고 유효 비트를 1로 설정합니다.

    6. 페이지 폴트를 발생시켰던 명령어를 다시 시작하여 정상적으로 실행되도록 합니다.

페이지(Page)와 프레임(Frame)

페이지와 프레임은 가상 메모리 시스템에서 논리적 주소 공간과 물리적 주소 공간을 관리하는 데 사용되는 핵심적인 개념입니다. 두 개념의 관계를 정리하면 다음과 같습니다.

  • 페이지(Page):

    • 정의: 가상 메모리 공간을 나누는 고정된 크기의 논리적 단위입니다. 프로그램의 주소 공간은 페이지라는 균일한 크기의 조각들로 나뉩니다.

    • 관점: 소프트웨어(프로그램)가 데이터를 인식하고 접근하는 논리적인 관점의 단위입니다.

    • 크기: 일반적으로 212 바이트(4KB)와 같은 2의 제곱수 크기를 가집니다.

    • 구성: 가상 주소는 가상 페이지 번호(Virtual Page Number)와 페이지 오프셋(Page Offset)으로 구성됩니다.

  • 프레임(Frame) 또는 페이지 프레임(Page Frame):

    • 정의: 주 메모리(물리 메모리) 공간을 나누는 고정된 크기의 물리적 단위입니다. 프레임은 페이지와 동일한 크기를 가집니다.

    • 관점: 하드웨어(주 메모리)가 데이터를 저장하고 관리하는 물리적인 관점의 단위입니다.

    • 크기: 페이지와 동일한 크기를 가집니다.

페이지 폴트 상황에서 일어나는 일련의 과정을 정확히 설명하면 다음과 같습니다:

  1. 가상 메모리 관점 (프로그램의 시야): 페이지를 찾는다

    • CPU(정확히는 MMU)가 가상 주소 변환을 시도할 때, 해당 **가상 페이지(Virtual Page)**가 현재 주 메모리에 로드되어 있는지 확인합니다.

    • 만약 해당 가상 페이지가 주 메모리에 없으면 (페이지 테이블의 유효 비트가 0이면) **"페이지 폴트(Page Fault)"**가 발생합니다.

    • 이 시점에서 운영체제(OS)의 역할은 "디스크에 저장되어 있는 해당 가상 페이지의 내용을 찾아" 주 메모리로 가져오는 것입니다. 즉, 프로그램의 관점에서 보면 '자신이 필요로 하는 페이지'를 찾는다고 표현하는 것이 자연스럽습니다.

  2. 물리 메모리/하드웨어 관점 (OS의 시야): 프레임에 올린다

    • OS가 디스크에서 필요한 페이지의 내용을 찾은 후, 그 내용을 저장할 주 메모리 내의 물리적인 공간을 확보해야 합니다. 주 메모리는 '프레임(Frame)' 단위로 나뉘어 관리됩니다.

    • OS는 비어 있는 **프레임(Frame)**을 찾거나, 비어 있는 프레임이 없을 경우 기존에 사용되던 프레임 중 하나(희생자 프레임)를 선택하여 비웁니다.

    • 그리고 디스크에서 읽어온 페이지의 내용을 선택된 그 프레임에 로드합니다.

    • 따라서 실제 물리적인 데이터를 이동시키는 하드웨어/OS의 동작 관점에서는 "디스크에서 데이터를 가져와 주 메모리의 특정 프레임에 올린다"고 표현하는 것이 정확합니다.

결론:

  • **"페이지를 찾는다"**는 표현은 논리적인 관점에서, 프로그램이 필요로 하는 가상 주소 공간의 특정 단위를 디스크에서 주 메모리로 가져오는 행위를 강조합니다.

  • "프레임을 올린다" 또는 **"페이지를 프레임에 로드한다"**는 표현은 물리적인 관점에서, 디스크의 페이지 내용이 주 메모리 내의 물리적인 저장 공간인 프레임으로 이동되는 구체적인 동작을 강조합니다.

주소 변환의 속도 향상 (TLB: Translation-Lookaside Buffer)

  • 페이지 테이블이 메인 메모리에 있기 때문에, 매 메모리 접근마다 두 번의 메인 메모리 접근이 필요하게 됩니다 (페이지 테이블 접근 1번, 실제 데이터 접근 1번). 이는 성능 저하를 가져옵니다.

  • 이를 해결하기 위해 **TLB(Translation-Lookaside Buffer)**라는 특별한 캐시가 사용됩니다.

  • TLB는 페이지 테이블의 최근 사용된 매핑 정보를 저장하는 고속 캐시입니다.

  • CPU가 가상 주소를 생성하면 먼저 TLB를 확인하여 물리 주소를 찾습니다.

    • TLB 히트: TLB에서 매핑 정보를 찾으면, 메인 메모리의 페이지 테이블에 접근할 필요 없이 바로 물리 주소를 얻어 데이터 캐시(CPU 캐시)에 접근할 수 있습니다.(메인 메모리를 1번만 접근)

    • TLB 미스: TLB에서 매핑 정보를 찾지 못하면, 메인 메모리에 있는 페이지 테이블에 접근하여 물리 주소를 가져옵니다. 이 정보는 TLB에도 업데이트되어 다음 번 접근 시에는 히트 확률을 높입니다.

    • 페이지 폴트: TLB 미스 이후 페이지 테이블을 확인했는데, 해당 페이지의 유효 비트가 0이면 페이지 폴트가 발생합니다.

TLB에서 '참조 비트(Reference Bit)'는 페이지 교체 정책과 관련하여 사용됩니다.

정확히 말하면, TLB 자체의 엔트리를 교체할 때 직접적으로 사용되기도 하지만, 더 중요한 역할은 TLB 미스 시 주 메모리의 페이지 테이블에서 해당 페이지가 최근에 사용되었는지를 판단하는 데 간접적으로 도움을 줍니다.

여기서 참조 비트의 사용 맥락은 주로 주 메모리(RAM)의 페이지 교체 알고리즘인 LRU(Least Recently Used)를 근사하는 데 있습니다.

참조 비트의 작동 방식:

  • 설정: 페이지가 주 메모리에 로드된 후 해당 페이지(또는 TLB 엔트리)가 접근될 때마다(읽기 또는 쓰기) 참조 비트는 0에서 1로 설정됩니다.

  • 초기화: 운영체제(OS)는 주기적으로 모든 참조 비트를 1에서 0으로 초기화(클리어)합니다.

LRU 근사에서의 활용:

  • OS가 페이지 폴트 발생 시 주 메모리에서 희생자 페이지(Victim Page)를 선택해야 할 때, 참조 비트가 0인 페이지를 우선적으로 고려합니다.

  • 참조 비트가 0이라는 것은 해당 페이지가 최근 초기화된 이후 한 번도 사용되지 않았음을 의미합니다. 반대로 참조 비트가 1인 페이지는 최근에 사용된 페이지이므로, LRU 원칙에 따라 교체 대상에서 후순위로 밀립니다.

1. TLB 접근 단계 (가상 주소 -> 물리 주소 변환)

  • 입력: CPU가 생성한 **가상 주소(Virtual address)**가 TLB(Translation-Lookaside Buffer)로 들어옵니다.

  • TLB에서의 주소 분할: 가상 주소는 **가상 페이지 번호(Virtual page number)**와 **페이지 오프셋(Page offset)**으로 분할됩니다.

  • TLB 태그 비교: TLB 내에서는 가상 페이지 번호를 TLB 엔트리의 **태그(Tag)**로 사용하여 비교합니다. 이 태그는 TLB에 저장된 가상 페이지 번호를 의미합니다.

  • TLB 히트 (TLB Hit):

    • 만약 TLB에서 가상 페이지 번호가 일치하고 유효 비트(Valid bit)가 1이면, TLB 히트가 발생합니다.

    • TLB 히트 시, 해당 TLB 엔트리에 저장된 **물리 페이지 번호(Physical page number)**를 즉시 얻게 됩니다.

    • 이 물리 페이지 번호는 원래 가상 주소의 페이지 오프셋과 결합되어 완전한 **물리 주소(Physical address)**를 형성합니다.

2. 캐시 접근 단계 (물리 주소 -> 데이터 획득)

  • 캐시 입력: TLB에서 변환된 물리 주소를 가지고 캐시에 접근합니다.

  • 물리 주소 분할: 물리 주소는 캐시에서 사용될 물리 주소 태그(Physical address tag), 캐시 인덱스(Cache index), 블록 오프셋(Block offset), **바이트 오프셋(Byte offset)**으로 나뉩니다.

  • 캐시 태그 비교: 캐시는 물리 주소의 캐시 인덱스를 사용하여 특정 세트를 선택하고, 그 세트 내에서 물리 주소 태그와 저장된 태그를 비교합니다.

  • 캐시 히트 (Cache Hit):

    • 만약 캐시에서 물리 주소 태그가 일치하고 유효 비트가 1이면, 캐시 히트가 발생합니다.

    • 캐시 히트 시, 캐시에서 요청된 데이터를 즉시 CPU로 전달합니다.

3. 미스(Miss) 발생 시 처리 (TLB 미스 및 캐시 미스)

  • TLB 미스 (TLB Miss) 발생 시:

    • TLB에서 가상 페이지 번호를 찾지 못하면 TLB 미스가 발생합니다.

    • 이 경우, 시스템(주로 운영체제)은 주 메모리에 있는 **페이지 테이블(Page Table)**에 접근하여 해당 가상 페이지 번호에 대한 매핑 정보를 찾습니다.

    • 페이지 테이블에서 물리 페이지 번호를 성공적으로 찾으면, 이 정보를 TLB에 업데이트하고(다음 번 접근을 위해), 다시 원래의 가상 주소를 가지고 TLB 접근 단계를 다시 시도합니다 (이를 retry라고 합니다).

    • 이후 TLB 히트가 발생하여 물리 주소를 얻고 캐시에 접근하게 됩니다.

  • 페이지 폴트 (Page Fault) 발생 시:

    • TLB 미스 후 페이지 테이블을 확인했는데, 해당 페이지가 주 메모리에 아예 없는 경우(페이지 테이블 엔트리의 유효 비트가 0인 경우) 페이지 폴트가 발생합니다.

    • 이것은 데이터가 디스크에 있다는 의미이므로, 운영체제가 디스크에서 해당 페이지를 주 메모리로 로드하는 복잡하고 느린 과정을 수행합니다.

    • 페이지가 주 메모리에 로드된 후 페이지 테이블과 TLB가 업데이트되고, 다시 처음부터 주소 변환 및 캐시 접근 과정을 시도합니다.

  • 캐시 미스 (Cache Miss) 발생 시:

    • TLB를 통해 물리 주소를 얻어 캐시에 접근했으나, 캐시에서 데이터를 찾지 못하면 캐시 미스가 발생합니다.

    • 이 경우, 캐시는 해당 물리 주소에 해당하는 데이터를 **주 메모리(Main Memory)**로부터 가져와 캐시에 로드하고, 그 데이터를 CPU로 전달합니다. 말씀하신 대로, 이 그림에는 주 메모리 부분이 직접적으로 그려져 있지 않지만, 캐시 미스 시 주 메모리 접근이 이루어집니다.

  • TLB miss 가 나타날 경우의 수는 2 가지가 됩니다.

    • TLB에 원하는 정보가 없는 경우(TLB Miss)

    • 가리키는 페이지가 실제로 메인 메모리에 없는 경우(Page Fault)

  • Page Table Hit : 데이터가 메인 메모리에 있음을 의미합니다.

  • Cache Hit : 데이터가 최근에 사용되었으며, 메인 메모리에 올라와 있음을 알 수 있습니다.

  • TLB Hit : 최근에 접근한 Page Table Entry 임을 의미합니다.

가상 메모리 기술은 현대 컴퓨터 시스템에서 필수적이며, 메모리 관리와 성능 최적화에 핵심적인 역할을 합니다.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기