기술 관련 정리

가상메모리란?

bewisesh91 2022. 4. 3. 12:09
728x90

가상 메모리(Virtual Memory)란?


가상 메모리란 개별 프로세스에게 독립적이고 개별적인 주소 공간을 제공하여 프로세스로 하여금 물리 메모리

전부를 사용하고 있다는 착각을 만드는 메모리 관리 기법입니다. 또한, 실제 프로세스 실행에 필요한 부분만

메모리에 올리고, 나머지는 디스크에 보관함으로써 실제 메모리보다 큰 메모리를 사용할 수 있습니다.

가상 메모리가 필요한 이유


다양한 이유가 있겠지만 멀티프로그래밍, 시분할과 관련하여 설명하고자 합니다. 컴퓨터는 고가의 장비이기에

이를 효과적으로 사용할 필요가 있습니다. 그래서 선택한 방법이 한 컴퓨터에서 여러 프로세스(멀티프로그래밍)를

짧은 시간 동안 번갈아 실행하여(시분할) 효율을 높이는 것이었습니다. 그런데 한 프로세스에서 다른 프로세스로

전환하는 것은 너무 느리게 동작합니다. 특히, 차지하는 메모리가 커질수록 느려집니다. 하드웨어의 특성 상

프로세스의 레지스터 상태를 저장하고 복원하는 것은 빠르지만, 메모리 내용을 디스크에 저장하는 것은 엄청나게

느리기 때문입니다. 프로세스 전환 시 프로세스를 메모리에 유지하는 방법, 여러 프로세스가 동시에 안전하게 존재

할 수 있는 방법이 필요해졌습니다.

가상 메모리의 장점은?


우선, 메모리 관리가 단순해집니다. 각 프로세스마다 통일된 주소 공간을 사용함으로써 프로세스가 메모리의

어떤 위치에 올라가야하는지 신경쓰지 않고 프로그래밍할 수 있습니다. 또한, 가상의 주소 공간과 매핑되는

실제 물리 메모리 주소는 하드웨어와 운영체제가 관리해줌으로써 각 프로세스가 다른 프로세스의 메모리 영역에

침범할 위험을 줄여줍니다. 또한, 메모리를 효율적으로 사용할 수 있습니다. 메모리를 디스크의 캐시로 설정하여,

지금 당장 사용하는 부분만 메모리에 유지하고 사용하지 않는 부분은 디스크에 보관함으로써, 적은 양의 메모리로

필요한 실행을 수행할 수 있습니다. 마지막으로 메모리를 확장하여 사용할 수 있습니다. 물리 메모리 크기는

제한적이지만 가상 메모리는 디스크를 이용하여 실제 메모리보다 더 큰 공간을 사용할 수 있습니다.

주소 변환 기법


주소 변환 시 사용하는 프로세서의 일부를 **메모리 관리 장치(Memory Management Unit, MMU)**라고 합니다.

1) 베이스, 바운드 레지스터

베이스와 바운드라 불리는 두 가지 레지스터를 이용하여 ****가상 주소를 실제 물리 주소로 변환하고, 프로세스가 오직

자신의 주소 공간에만 접근한다는 것을 보장하는 기법을 의미합니다.

프로그램 시작 시, 운영체제는 프로그램이 탑재될 물리 메모리 위치를 결정합니다. 그리고 베이스 레지스터를 해당

주소로 지정합니다. 이후, 프로세스가 생성하는 가상 주소에 해당 베이스 레지스터 값을 더하여 실제 물리 주소로

변환합니다. 바운드 레지스터를 이용하여 해당 메모리 참조가 유효한지 확인합니다. 프로세스가 해당 바운드를

넘어가는 메모리를 참조하면 예외를 발생시킵니다. 하지만 프로세스 스택과 힙 사이 공간이 낭비되는 내부 단편화

문제가 있습니다.

2) 세그멘테이션

세그멘테이션이란 MMU에 하나의 베이스와 바운드 값이 존재하는 것이 아니라, 프로세스의 주소 공간을 의미

단위의 세그먼트로 나누고, 세그먼트마다 베이스와 바운드 값이 존재하여, 각 세그먼트를 물리 메모리의 각기 다른

위치에 배치하는 기법을 의미합니다. 이와 같은 세그멘테이션 기법은 시스템이 세그먼트 단위로 가상 주소 공간을

물리 메모리에 재배치하기 때문에 물리 메모리를 절약할 수 있습니다. 더욱이 세그멘테이션에 필요한 산술 연산은

쉽고 하드웨어 구현에 적합하기 때문에 속도가 빠릅니다. 그러나 세그먼트의 크기가 일정하지 않기 때문에 외부

단편화 문제가 발생할 수 있습니다. 또한, 세그멘테이션은 아직 드문드문 사용되는 주소 공간을 지원할 만큼 충분히

유연하지 못합니다. 예를 들어, 크기가 크지만 드문드문 사용되는 힙에 접근하기 위해서는 여전히 힙 전체가 물리

메모리에 존재해야 하기 때문입니다.

3) 페이징

페이징이란 프로세스의 주소 공간을 고정 크기의 페이지로 나누고, 물리 메모리를 페이지 프레임이라 불리는

고정 크기 슬롯의 배열로 간주하여 페이지를 서로 다른 프레임에 저장하는 기법을 의미합니다. 페이징을 사용하면

프로세스의 주소 공간 사용 방식과는 상관없이 효율적으로 주소 공간 개념을 지원할 수 있습니다. 예를 들어, 힙과

스택이 어느 방향으로 커지는지 등을 고려하지 않아도 됩니다. 또 다른 장점은 빈 공간 관리의 단순함입니다.

예를 들어, 64 바이트 주소 공간을 물리 메모리에 배치한다고 할 때, 단순히 비어 있는 4개의 프레임을 빈 공간

리스트에서 찾으면 됩니다. 주소 공간의 각 가상 페이지에 대한 물리 메모리 위치를 기록하기 위하여 운영체제는

프로세스마다 페이지 테이블(Page Table)이라는 자료구조를 유지합니다. 페이지 테이블의 주요 역할은 주소 변환

정보를 저장하는 것입니다. 그런데 페이지 테이블은 매우 커질 수 있습니다. 따라서 MMU에 저장이 어렵고 보통

메모리에 저장합니다. 그런데 문제는 주소를 찾기 위해서 페이지 테이블을 확인해야 하기에 메모리 참조가

두번 이루어집니다. 이는 굉장히 느린 작업이기에 추가적인 개선이 필요합니다.

주소 변환을 위한 TLB


페이징은 주소 공간을 작은 크기의 페이지로 나누고 각 페이지의 실제 위치에 대한 매핑 정보를 메모리에 저장하는

기법입니다. 이때, 매핑 정보를 저장하는 자료 구조를 페이지 테이블이라 하며, 큰 메모리 공간을 요구합니다.

그런데 더욱 문제가 되는 것은 가상 주소에서 물리 주소로의 주소 변환을 위해 메모리에 존재하는 매핑 정보를

읽어야 한다는 사실입니다. 페이지 테이블 접근을 위한 메모리 읽기 작업은 엄청난 성능 저하를 유발합니다.

주소 변환을 빠르게 하기 위해서 메모리 관리부(MMU)의 변환 색인 버퍼(TLB, Translation Lookaside

**Buffer)**를 이용할 수 있습니다. TLB는 자주 참조되는 가상 주소-실제 주소 변환 정보를 저장하는 하드웨어

캐시입니다. 가상 메모리 참조 시 하드웨어는 TLB에 원하는 변환 정보가 있는지를 먼저 확인합니다. 만약 있다면

모든 변환 정보를 갖고 있는 페이지 테이블을 통하지 않고 변환을 빠르게 수행할 수 있습니다. 이를 TLB 히트라고

합니다. 그런데 만약 TLB에 해당 정보가 없어 TLB 미스가 발생한다면 페이지 테이블에서 변환 정보를 확인하고

TLB를 업데이트 합니다.

멀티 레벨 페이지 테이블


페이지 크기를 증가시키면 페이지 테이블의 크기를 간단하게 줄일 수 있습니다. 그런데 페이지 크기의 증가는

부작용을 수반합니다. 가장 큰 문제는 페이지 내부의 낭비 공간이 증가합니다. 이를 내부 단편화라 합니다.

만약 프로그램이 커다란 페이지를 할당받고 그중 일부분만 사용한다면, 그리고 여러 페이지를 할당받는다면

메모리는 금방 고갈될 것입니다. x86 시스템에서는 일반적으로 4KB 페이지를 사용합니다.

멀리 레벨 페이지 테이블에서는 선형 페이지 테이블을 트리 구조로 표현합니다. 먼저, 페이지 테이블을 페이지 크기

단위로 나눕니다. 페이지 테이블의 페이지가 유효하지 않은 항목만 있으면 해당 페이지를 할당하지 않습니다.

페이지 디렉터리라는 자료 구조를 사용하여 페이지 테이블 각 페이지의 할당 여부와 위치를 파악합니다.

페이지 디렉터리는 페이지 테이블을 구성하는 각 페이지의 존재 여부와 위치 정보를 가지고 있습니다.