메모리에 관한 용어들

from Study/System 2007/10/16 14:55 view 24404
가상메모리 (Vitrual Memory)

 Vitrual Memory로 말그대로 실재 존재하지는 않지만 메모리 역할을 하는 것을 말하는데 윈도우는 하드 디스크의 일정 영역을 '가상 메모리'로 사용합니다.

스왑 (swap)

 시분할 운영체제에서 어떤 작업의 주기억장치 영역의 이미지를 보조기억장치에 기록하고, 다른 작업의 이미지를 주기억장치에 읽어 넣는 방식

* 주메모리의 한도를 넘는 프로세서를 실행하면 가상메모리(하드디스크의 일부분)에 주메모리가 로드할 데이터들중 일부 이미지들이 보내지어 작업처리량을 높이며 효율적으로 한다는것이 바로 가상메모리와 스왑의 메카니즘이긴하나

 하드디스크와 램사이의 전송속도자체의 차이와 주메모리가 넘겨주었던 데이터이미지들을 하드디스크로부터 다시 받는 이 과정에서 연산제어가 딱 맞아떨어지면 그횟수가 합리적 경제적으로 적어지겠지만 그렇지 못하는 경우가 생길때도 있어 흔히 이럴때 우리가 하드스왑현상으로 작업대기및 지연시간이 생겼다라고 말하는것같습니다.


메모리의 구조와 설명 

사용자 삽입 이미지
  메모리의 구조

* Null-pointer Assignment

  이 지역은 프로그램상의 메모리 접근 오류를 잡아내기 위하여 할당된 영역입니다. 어떤 프로그램이든 이 영역에 읽고 쓰기가 금지되어 있는데 이 지역에 read/write가 행해지면 시스템은 access viloation을 발생시킵니다.
시스템으로부터 메모리를 정상적으로 할당 받지 못할 경우 NULL(0x0)을 리턴받게 되는데 바로 이런 NULL pointer assignment를 방지하기 위한 공간입니다.

* MS-DOS 16-bit Compatibility(win98 only)

 win9x에만 존재하는 4MB의 공간으로 MS-DOS와 win16과의 하위 호환성을 유지하기 위한 공간입니다.
이 공간 또한 read/write가 금지되어야 하는데 MS사에서 기술적인 몇 가지 이유로 이 공간을 보호하지 못했다고 하군요.
 win2000에서는 DOS나 win16 어플리케이션을 자신의 유저 주소 공간에서 실행하기 때문이 이 영역이 없다고합니다.

* User area

 프로세스의 사용자 공간입니다. 다른 프로세스에 의해 간섭받지 않는 고유의 공간으로서 이 공간에 exe와 dll 모듈등 자신들만의 데이타를 담는거라고 합니다.
 특기할 만한 것은 win9x에서는 처음 4MB를 제외한 0x400000부터 0x7FFFFFFF인 반면, win NT는 0x10000부터 0x7FFEFFFF로 역시 처음 2GB에서 64KB를 제외한 부분입니다.

 이는 어떤 프로그램이 실행될 때 메모리 상의 베이스 주소가 다를 수 있다는 것인데, 때문에 프로그램을 만들 때 win NT는 win 9x와 호환성에 주의해야 하는것이더군요.

 win NT에 맞추어 프로그램의 베이스 메모리를 0x10000로 맞추었다가는 win9x에서는 접근이 금지된 지역이므로 실행이 불가능하게 됩니다. (물론 요즘엔 win 9x가 사라져가는 추세라서 그리 큰 영향은 없겠지만..)

* 64KB Off-Limits(win2000 only)

 0x7FFF0000부터 0x7FFFFFFF까지는 win NT에서 처음 64KB의 영역과 마찬가지로 메모리 경계(off-limit)를 나타내는 지역입니다. 커널 영역의 접근을 방지하기 위한 일종의 완충지역이라고 보면 된다고 하는데 어렵군요.

* Shared Memory Mapped File(win98 only)

 win9x에만 존재하는 이 1GB의 영역은 모든 프로세스들이 공통적으로 접근하고 공유할 수 있는 시스템 dll들과 MMF(memory-mapped files)가 적재되는 곳입니다. 3대 시스템 dll이라 불리는 kernel32.dll, user32.dll, gdi32.dll에서 advapi32.dll도 이 영역에 로드되며, win NT에서는 이런 시스템 dll조차 비공유 메모리 영역에 따로 적재하여 사용합니다.
 (이런한 이유로인하여 2000의 보안성이 더 높아 금융권에서도 아직 널리 사용되는건 아닐련지 생각해봅니다.)

* Kernel area

win9x에서는 1GB, win NT에서는 2GB로 예약되어 있는 커널 공간입니다.
스케쥴러, 메모리 관리자, 파일 시스템 코드, 네트워크 코드등의 OS 코드와 디바이스 드라이버 레벨의 모듈이 적재되는 곳이며, 원칙적으로는 이 영역에 대한 read/write가 금지되어 있지만,  win98에서는 이 영역에 대해 접근이 가능합니다.
 유저 어플리케이션에서 이 영역을 손상시킬 수 있다는 점 때문에 win98이 자주 다운되고 불안하다는 비난을 받게 된 이유입니다.




●물리적 메모리와 가상 메모리의 매핑 관계

사용자 삽입 이미지
 
물리적메모리와 가상메모리의 매핑관계

* Page table에는 페이지가 RAM에 존재하는지 paging file에 존재하는지에 대한 정보를 가지고 있습니다.
 옛날 DOS및 윈3.1 시절에는 시스템의 메모리는 그 시스템에 설치된 RAM이 전부였습니다. 만약 시스템에 1MB의 RAM이 설치되어 있다면 커밋할 수 있는 메모리는 1MB가 전부였던 것이지요 .
(예를들어 Dos경험자 분들의 공통적인 눈물겨운 사투 EMM386등을 이용한 메모리 확장(Extened) 노가다)

 그러나 오늘날의 현대적 운영체제들은 대부분 시스템에 설치된 RAM 이외에 디스크 파일을 메모리로 간주할 수 있는 메커니즘을 제공하고 있으며, 이 때 이 메모리로 간주되는 파일을 페이징 파일(paging file)이라고 합니다.
 간단히 말해 자신의 시스템에 256MB의 메모리와 256MB의 페이징 파일을 가지고 있다면 물리적 메모리는 512MB가 되는 것입니다.

● 쓰레드 (thread)

 thread는 process 안에서 실행되는 코드의 실행 흐름이라고 할 수 있습니다.

 쓰레드는 프로세스가 할당한 메모리 영역에서 실행되며 프로세스에 할당된 시스템 자원을 사용하게 되며, 프로세스가 생성되고 초기화될 때마다 운영체제는 기본쓰레드(primary thread)를 생성하게됩니다.

  각 쓰레드는 명령 코드와 함께 CPU 레지스터 상태를 저장하는 context와 2개의 스택 영역이 포함되고, 2개의 스택 영역은 특권 프로세스 모드와 사용자 모드를 위한 스택입니다.

● 스레싱( thrashing)

 한 프로세스의 어떤 쓰레드thread 가 프로세스 주소 공간에 있는 데이타에 접근하려고 할 때 그 데이타가 RAM에 존재하고 있다면 CPU는 프로세스의 가상 주소를 해당 물리 주소에 맵핑하고 데이타에 접근하게 됩니다.  그러나 데이타가 RAM에 없다면 그 데이타가 페이징 파일에 있는지 확인하게 되겠지요.

이 상황을 Page fault라고 합니다. page fault가 발생하면 시스템은 페이징 파일내에 데이타가 존재하는지 확인하고 없다면 access violation을 발생시킵니다.

 
 접근하려는 데이타가 페이징 파일에 있다면 시스템은 현재 RAM에 비어 있는 페이지가 존재하는지 확인하고 존재하지 않는다면 RAM상의 어떤 페이지 중에 한 페이지를 선택해서 이를 해제free하게 됩니다.

 만일 해제하려는 페이지의 데이터가 RAM에서 변경된 적이 있다면 (이를 데이터가 더럽혀졌다(dirty)라고 합니다.)

 해당 페이지의 내용을 페이징 파일에 갱신한 후 해당 RAM 페이지를 해제하는데, 새로 비워진 페이지에 원래 접근하려고 했던 데이터가 존재하는 페이지를 페이징 파일로부터 로딩하게 되고 CPU가 가상 주소를 물리 주소에 맵핑한 후에야 비로소 데이터에 접근하게 되는 것입니다.

 만일 시스템에 RAM이 부족하게 되면 page fault가 빈번하게 발생하게 되고 운영체제는 계속해서 RAM과 하드 디스크의 페이징 파일 사이에서 페이즈를 바꾸는 작업에 대부분의 시간을 소모하게 되겠지요.

  이런 현상을 바로 thrasing이라고 부르는데 가끔 win2000/Xp계열을 사용하다보면 어느 순간에 이유없이 하드 디스크가 버버벅 거리며 돌아가면서 성능이 저하되는 모습을 본적이 있을 것입니다.

 이때가 바로 thrashing이 발생한 경우이며 이쓰레드는 인텔계열로 치자면 CPU자체의 L2캐쉬의 크기와 듀얼코어이냐 싱글코어이냐에 따라 발생하는 쓰레씽이 작업지연시간이 줄어들고 여러개의 쓰레씽들도 처리하는 속도가 차이가 나게됩니다.

여기서 한 시스템에 수많은 프로그램들이 동시에 실행된다면 그 많은 프로그램들의 실행 코드나 데이타들을 페이징 파일에서 할당해야 할 테니 페이징 파일이 대책없이 커지지 않을까 하는 의문을 가질 수 있는데.

 이것을 방지하기 위해 시스템은 프로그램이 실행될 때 실행 파일을 열고 코드와 데이타의 크기를 먼저 확인한 뒤에 실행에 필요한 만큼의 영역을 확보한 후 실행 파일의 이미지 자체를 영역으로 할당합니다. 프로그램의 .exe 실행 파일이나 DLL등의 파일 이미지가 주소 공간의 확보된 영역으로 사용될 때 이를 memory mapped file이라고 합니다.

 (예를들어 윈도우즈에서 실행중인 파일이나 dll을 삭제하려고 할 때 "실행중이므로 삭제할 수 없다"라는 메시지가 뜨면서 삭제가 안되는 경우를 많이 보았을 것입니다. 이는 실행한 파일이나 dll을 전부 메모리에 올리지 않고 필요한 부분만 메모리에 올려지고 나머지는 memory mapped file로 묶여져 있기 때문인 것입니다.)

● 가상메모리 설정법

 가상메모리는 실제 물리적메모리의 1.5~2배정도를 설정해주는것이 좋다는 MS사의 비공식? 사항이 있었던 것으로 기억하며 설정방법은 최소와 최대를 모두 같은값(실제 물리적메모리의 1.5~2배 의 값)으로 설정하는 것을 추천합니다.
그리고 가상메모리공간을 확보할 하드디스크는 운영체제가 설치되어있는 드라이브가 아닌 다른 드라이브로 함으로써 스왑현상을 어느정도 해소하게 하는것이 좋습니다.

예를 들어 비스타 얼티메이트 64비트 사용합니다. 파티션은 100g를 둘로 나눠서 d에 가상메모리 시스템이 관리시키고 위에 모든드라이브에서 윈도우에서 자동관리해놓고 그냥 사용합니다.
1.5배,2배 굳이 지정하지 않구요.

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다