Windows 운영체제

Windows 프로세스 메모리 할당

노력하는우리 2021. 3. 13. 23:30

Windows는 프로세스 별로 가상 메모리 4GB(32비트 환경 기준)를 할당한다. (물리 메모리가 아니고 가상메모리를 할당)

CPU는 가상 메모리 기준으로 작업하고 중간에 중계 역할을 해주는 MMU(Memory Management Unit)가 물리 메모리와 연결 시켜준다

 

1.0x00000000~ 0x00000FFF : NULL 값 할당 영역(4KB)

2.0x00001000~ 0x003FFFFF : 도스 및 16 비트 어플리케이션 영역

3.0x00400000~ 0x7FFFFFFF : 프로세스 영역(사용자 영역 1.9GB)

4.0x80000000~ 0xC0000000 : 공유 메모리 영역(메모리 맵 영역 1GB)

5.~ 0xFFFFFFFF : 커널 영역

 

1. NULL 값 할당 영역 : 우리가 포인터에 NULL(0)을 집어 넣었을 때 참조되는 영역 값은 변경 불가능

2. 도스 및 16 비트 어플리케이션 영역 : 과거 16비트 프로그램과의 호환을 위한 영역 (사실상 없다고봐도 무방)

3. 프로세스 영역: 실질적으로 우리가 작업하는 공간 우리가 익히 알고있는 DATA, HEAP, STACK, CODE 영역이 있다.

4,5 : 둘다 커널영역으로 봐도 무방하다. 우리가 쓸 수 없는 공간이므로 이 곳을 포함해 4GB가 할당 된다고 해도 우리는 실질적으로 프로세스 영역 2GB만 쓸수 있다.(32비트 환경 기준)

 

자 그러면 실제로 우리한테 2GB의 영역이 주어졌는지 확인해보자

 

우선 스택을 확인하기 위해 2MB정도의 스택영역을 사용해보았다.

결과는

우리가 한번 쯤 봤을 법한 스택 오버플로가 발생했다.

왜 그런걸까?

 

스택은 Default로 1MB의 가상메모리가 할당되기 때문이다.여유있게 3MB정도로 설정 후 테스트를 해보면

컴파일이 된다.

 

우리가 알고있는데로 프로세스당 우리에게 2GB가 주어지니 스택 예약 크기를 2GB로 해놓고 컴파일을 하면 어떻게 될까?

메모리 리소스가 부족하다는 에러가 나왔다.

스택 힙 코드 데이터 골고루 나눠서 쓰라고 준 2GB를 전부 스택에 할당해버렸기 때문이다.

 

그렇다면 64비트 환경에서 스택 예약 크기를 2GB로 설정후 컴파일 해보면 어떻게될까?

 

문제없이 컴파일이 된다.

64비트환경에서는 2의 64승 BYTE를 할당 받기때문에 32비트환경의 4GB(유저영역은 2GB)와는 비교가 되질 않을 정도로 크다.