신입 게임 개발자의 프로그래밍 일기
메모리 관리 기법(Memory Management)관련 기술들(간략한 설명) 본문
아래의 기술들은 C++ 입문자에서 벗어나기에서 메모리(Memory) 포스팅을 준비하여 조사한 기술들입니다.
이 포스팅에서 자세하게까지는 설명하지 않고 이러한 기술들이 있다는 정도의 간단한 설명 정도만 적어놓았습니다.
잘못된 정보가 있다면 언제든 지적해주시면 감사하겠습니다.
오버레이(Overlay)
(목표)
-물리 메모리보다 큰 프로세스를 동작시키기 위해 사용하는 기술
(기술 개요)
-전체 프로그램을 몇 개의 모듈들로 나누어 컴파일하고 수행시점에 필요한 모듈만을 메모리로 적재하여 사용한다.
(부연 설명)
-오버레이 기술은 운영체제로부터 어떤 특별한 지원을 받지 않습니다.
운영체제의 도움이 없기 때문에 프로그래머는 오버레이 기술을 적용할 프로그램의 모든 구조를 완전히 이해하고 있어야만 하는데
그 이유는 프로세스가 실행되는 각 과정별로 필요한 코드 및 데이터만을 가진 모듈을 만들 수 있을 것이기 때문입니다.
-메모리 관리 장치(Memory Management Unit, MMU)가 없는 임베디드 시스템과 같은 분야에 주로 사용하는 기술
스와핑(Swapping)
(목표)
-여러 개의 프로세스를 동시(?)에 실행 할 수 있도록 만든 기술
(기술 개요)
-프로세스 하나가 메모리를 점유하고 있다가 다른 프로세스를 실행시키려고 할 때
현재 메모리를 점유하고 프로세스의 모든 코드 및 데이터를 2차 보조기억장치(Disk)의 특정 영역(Swap Partition) 혹은 파일(Swap File) 형태로
저장하고 추후에 다시 해당 프로세스를 실행 시, 해당 영역 또는 파일을 사용하여 프로세스를 메모리에 적재시킵니다.
(부연 설명)
-프로세스가 스왑되는 과정에서 CPU의 유휴 시간이 길어져 시스템의 성능에 매우 않좋습니다.
=>이것을 해결하기 위해 페이징(Paging) 기법이 도입됩니다.
페이징(Paging) using Virtual Memory
(목표)
-프로세스의 일부분만을 메모리에 적재시킬 수 있도록 만든 기술
(기술 개요)
-프로세스의 공간 구역성(Spatial Locality)와 시간 구역성(Temporal Locality)을 활용하여 프로세스 전체가 메모리를 점유하지 않더라도
프로세스들이 동작할 수 있도록 만드는 것이 기본적인 아이디어입니다.
-Page Table을 활용하여 CPU가 논리적으로 사용하는 주소를 Physical Address가 아닌 Virtual Address로 교체하여
CPU는 연속된 메모리를 사용하는 것처럼 착각을 하게 만듭니다.(실제로는 물리 메모리에 적재된 Page들은 연속적이지 않습니다.)
(부연 설명)
-일반적으로 가상 메모리와 같이 이용되는데 가상 메모리 없는 페이징은 팥 없는 진빵입니다.
그 이유는 CPU는 프로세스의 코드를 순서대로 수행해시켜야 하는데 프로세스를 페이지 단위(4KB)로 나누더라도
물리 메모리에 페이지의 순서대로 적재를 시켜야 한다는 것은 변함이 없습니다. 추가적으로 페이지 단위로 나누더라도
가상 메모리 없이는 프로세스를 실행시키기 위해서 전체 프로세스의 코드를 메모리에 적재한다는 점은 똑같습니다.
오히려 페이징 요구(Demand Paging)가 발생했는데 해당 페이지가 메인 메모리에 적재되어 있지 않은 상태 즉, 페이지 폴트(Page Fault)가 발생하면
page-in, page-out이 필요한 상황이 발생하게 됩니다. 먼저 임의의 메모리 위치에 Page 하나를 적재합니다. 그런데 좀 있다가 적재한 Page의 코드가
수행을 마치고 추가적으로 Page를 요구하는 상황이 발생하면 첫번째 Page에 이어서 두번째 Page를 적재시켜야 합니다.
이런 상황이 연이어 발생하게되면 전체 프로세스를 한번에 적재하는 세그멘테이션(Segmentation)과 같은 가변분할 방식과 결과적으로는 같아집니다.
단지 Page단위로 하나씩 물리 메모리에 순서대로 적재한다 할 뿐입니다.
*Demand Paging: 추가적인 Page를 요구하는 작업
*Page Fault: Demand Paging으로 요구하는 Page가 메인 메모리에 적재되어 있지 않은 상태
공간 구역성(Spatial Locality)
-어떤 프로세스가 메모리의 한 곳을 일단 액세스하기 시작하면 해당 메모리 주변 데이터도 곧이어 사용될 확률이 높다는 것을 의미합니다.(ex. 배열)
시간 구역성(Temporal Locality)
-한번 액세스된 데이터는 곧이어 다시 액세드될 확률이 높다는 것을 의미합니다.(ex. 루프를 돌 때 사용되는 순회 변수)
*구역성(Locality)는 어디까지나 예측입니다. 하지만 이 예측을 이용하여 캐시 및 버퍼와 같은 성능을 최적화시키는 데에 사용되기도 합니다.
메모리 관리 장치(Memory Management Unit, MMU)
-Virtual Address를 Physical Address로 변환(Virtual Address Translation, VAT)시키는 하드웨어 장치로
CPU의 일부분으로 구현되기도 혹은 별도의 분리된 집적회로로 구현될 수 도 있습니다.
가상 메모리(Virtual Memory)
(목표)
-물리 메모리보다 큰 프로세스를 동작시킬 수 있다는 장점
-메모리가 연속적으로 할당되어있다는 것으로 착각하고 코드를 작성할 수 있다는 장점
-각각의 프로세스는 다른 프로세스의 메모리를 침범할 수 없다는 보안 관점에서의 장점
(기술 개요)
-프로세스가 사용하는 메모리를 메인 메모리(RAM)뿐만이 아니라 추가적으로 2차 기억장치(Disk)의 메모리를
사용할 수 있도록 한 기술입니다.(2차 기억장치에 저장되는 프로세스 임시 파일을 Swap File or Page File이라고 말함)
-메모리 관리 장치라는 하드웨어와 페이징 처리 기술을 통해서 구현됩니다.
(부연 설명)
-32비트에서는 물리 메모리보다 큰 메모리를 사용할 수 있다는 장점이 중요했지만 64비트에 와서는 32비트의 4GB 물리 메모리 인식
제한을 훨씬 넘어서는 크기의 물리 메모리(이론상, 16엑사(Exa)==16,777,216GB)가 인식이 가능해졌으므로 32비트때에 비하면 큰 장점이 되지는 않습니다.
링크: 64비트 운영체제인 Windows 7/8에서의 최대 물리 메모리 인식 크기
Physical Address Extension(PAE)
-32-bit 컴퓨터가 최대로 인식할 수 있는 물리 메모리 한계는 4GB입니다.
이 기술은 36-bit로 물리 주소체계를 변경하여 4GB이상의 메모리를 사용할 수 있도록 한 기술이지만
인식만 할 뿐 프로세스가 사용하는 가상 메모리의 크기는 여전히 4GB(Kernel+Application)입니다.
-램을 캐시로 이용하는 등의 방법으로 활용 가능합니다.
4-Gigabyte Tunning
-일반적으로 32비트 운영체제에서 프로세스는 4GB의 가상 메모리 할당받는데 온전히 프로세스가 4GB 전부를 마음대로 사용할 수 있는 것은 아닙니다.
절반인 2GB는 커널을 위해 사용하므로 사실상 2GB를 사용하는 것인데 이 기술은 커널이 사용하는 공간을 1GB로 줄여서
3GB 공간을 사용할 수 있도록 한 기술입니다.
Address Windowing Extension(AWE)
-프로세스에게 운영체제에 의해 디스크로 스왑되지 않는 메인 메모리를 할당할 수 있는 방법을 제공하는 기술
추가적으로 프로세스의 주소 공간보다 더 큰 램에 접근할 수 도 있는 방법을 제공하기도 하지만 사실상 64-bit에 와서는 쓸모가 없습니다.
개인적인 푸념:
조사 및 공부하면서 용어 혼동이 많이 있었다.
검색을 할 때 스와핑에 대해 찾으려고 하니 가상 메모리에 적재되어 있는 Page가 적재 및 해제 될 때 page-in, page-out이 계속해서 검색되었습니다.
좀 더 검색해보니 현재 일반적으로 page-in, page-out은 각각 swap-in, swap-out으로도 쓰이는 것을 확인할 수 있었습니다.
마찬가지로 swap file과 page file도 일반적으로 두개가 동일한 뜻으로 사용되고 있습니다.