본문 바로가기
Development/C & C++

Memory in Windows system

by nickeys 2011. 5. 9.
y# Win16의 메모리 구조
 80286프로세서에서는 최대 16MB까지의 메모리를 지원 하였으나 하위 호환성을 위해 1MB까지 밖에 보통을 사용하지 않았다.
1MB를 액세스 하기 위해서는 20bit의 주소 영역이 필요 하였으므로 평면적인 메모리 구조로는 접근이 불가했다.
따라서 이를 위해 세그먼트/오프셋 구조를 사용했으며, 모든 프로그램이 같은 주소 공간에서 실행되어 응용프로그램들 사이는 물론
시스템 영역까지도 침범이 가능했다.

# 4GB 평면 메모리 모델
 16비트 환경의 부족한 메모리와 구조적인 문제를 근본적으로 해결한 CPU는 80386이다(이후는 그냥 처리속도만 증가함).
80386CPU가 관리할 수 있는 메모리는 최대 4GB(2의 32승)의 주소공간을 지원한다(주소공간은 프로세스가 가지는 가상의
메모리 주소).

# 가상메모리(Virtual Memory)와 주소공간
 가상 메모리는 'Ram+Paging file in HDD'이다(HDD에 있는 Paging file은 속도가 느린 Ram이라 생각하면 됨).
32bit의 Windows환경에서는 프로세스가 4GB의 주소공간을 가상 메모리에 맵핑(mapping)해서 사용하는데, 이 때 맵핑은
페이지 테이블이 담당한다. 주소공간은 각 프로세스의 가상 공간이므로, 각각의 프로세스는 다른 프로세스의 공간에 침범할 수
없다(주소공간의 지역화). 또한, Windows환경에서는 H/W들을 운영체제가 관리하여 응용프로그램이 직접 H/W에 접근하지 못하게
금지되어 있으며 물리적인 메모리 또한 H/W와 마찬가지로 직접적인 접근이 불가능하다.
 운영체제가 필요에 의해 가상 메모리의 위치를 옮기더라도 페이지 테이블을 같이 수정하면 응용프로그램 입장에서는 이와는 관계 없이 그전에 사용하던 주소를 그대로 사용할 수 있다.
 그리고 만약, 가상 메모리에 연결되지 않은 빈 주소 영역을 접근하면 이것을 액세스 위반 이라고 하며 이런 프로세스는 시스템에 의해 즉시 죽는다. 가상 메모리는 4GB나 되므로 파티션(Partition)을 나누어 사용하게 되는데, 보통 1GB의 운영체제 영역+응용프로그램 영역으로 구성된다(각 영역 사이는 완충 역할로 NULL 포인터 트랩이 존재한다).

# 가상 메모리 관리
 Win32프로세스가 가지는 4GB의 가상 주소 공간은 Page단위(보통 4KB)로 구성된다. 그리고 각 페이지는 다음과 같은 3가지 상태로 존재한다.
1) Free : 사용되지 않는 영역으로 언제든지 예약 또는 확정할 수 있다.
2) Reserved : 주소 공간에는 사용을 선언 했지만 실질적인 가상 메모리와는 맵핑이 이뤄지지 않은 영역. 따라서 사용은 할 수 없다.
3) Committed : 주소 공간에 사용을 선언하고 가상 메모리와 맵핑되어 실재로 사용 가능한 영역.
 주소가 연속적인 메모리를 사용하고자 할 때에는 미리 해당 주소공간의 연속되는 메모리를 예약 해두었다가 현재 사용하는 메모리만 확정해서 사용하는 기법을 사용하면 실재로 메모리를 사용하지 않으면서도 연속되는 주소를 가지는 메모리를 사용할 수 있다.
 가상 메모리를 할당 할 때는 VirtualAlloc함수를 사용하는데, 가상 주소 공간의 단위는 두 가지가 있다.
할당단위(Allocation Granualrity)와 Page가 그것이다. 할당 단위는 주소공간의 메모리를 할당 할 때 할당되는 단위를 말하며, 대부분의 플랫폼에서 할당단위는 64KB이다. 이 말은 VirtualAlloc을 이용해서 메모리를 할당 했을 때에는 할당 받은 메모리는 64의 배수 번지에서 항상 시작한다는 의미다. 또한, 페이지는 그 영역에서 4KB단위로 실재로 할당 된다.
e.g> ptr = (int*)VirtualAlloc(0xb71234, sizeof(int)*10, MEM_RESERVE, PAGE_READWRITE);
이와 같이 할당을 받을 경우는 시작주소를 명시적으로 0xb71234번지라고 지정해도 64의 배수 번지가 시작 주소가 되므로 하위 2bytes를 0으로 만든 주소인 0xb70000에서 시작해서 4*10 bytes 만큼의 공간을 할당받는다.
 VirtualAlloc이 malloc함수에 비해 가지는 이점은 2가지다. 첫 째, 메모리를 예약할 수 있다. 둘 째, 메모리에 대한 접근 권한을 지정 가능하다.
 realloc함수는 굉장히 느리고, 재할당할 때마다 번지수가 바뀔 수 있다는 단점이 있으므로 이럴 때 VirtualAlloc함수를 이용하는 것이 좋다(대용량의 가변적인 메모리를 다룰 때). 그러나 가상 메모리는 Page단위로 구성이 되므로 적은 메모리를 사용할 때에는 realloc이 더 유리하다.

'Development > C & C++' 카테고리의 다른 글

C++0x - rvalue reference <- 위키백과 내용을 번역.  (0) 2011.07.09
DLL  (0) 2011.05.09