[Fundamental C++] 3. 메모리
가상메모리
핵심은 각각의 프로세스에게 메모리 공간이 독립적으로 부여된다는 것.
개별 프로세스는 부여받은 메모리 영역은 해당 프로세스만이 접근할 수 있도록 보호된다. 독립적으로 부여되어 타 프로세스가 해당 메모리 영역을 침범할 수 없고, 안정성을 크게 향상
가상메모리의 크기
x86는 32비트 시스템이다. 주소를 가리킬 수 있는 레지스터의 크기가 32비트라는 의미.
이론적으로 2의 32승인 대략 42억 개의 주소가 나오고 각각의 주소가 1바이트씩 가리킬 수 있으므로 각각의 프로세스는 4GB의 메모리를 부여받고, 윈도우의 경우 부여된 4GB의 절반은 운영체제가 사용. 나머지 2GB만 사용가능하게 된다.
x64는 64비트 시스템이며 레지스터의 크기가 64비트이므로 이론적으로는 2의 64승 개의 주소를 사용할수 있기에, 이론적으로 대략 1천 6백만TB의 메모리 공간이 부여될 수 있다. 사실상 무한한 공간인데 이렇게까지 필요 없어서 윈도우의 경우 대략 8TB 의 공간만을 부여하도록 제한하고 있다. 마찬가지로 운영체제가 절반을 사용하므로 나머지 반만 사용가능하게 된다.
가상메모리 구조
Code(Text) |
Data |
BSS |
Heap & Stack |
가상메모리 프로세스 영역
위 표는 가상 메모리 구조를 보여준다.이전에 설명했듯이 가상 메모리를 부여받고 반은 운영체제가 사용하고 나머지 반을 사용할수있는데 실제 프로세스가 사용하는 영역이라고 할 수 있다. 보통 프로세스 메모리 영역이라고 한다.
위부터
1. 코드영역(Code)
소스코드 그 자체가 저장. 함수나 상수 등. 오직 읽기만 가능하다 쓰기가 금지되는 이유는 안정성을 위해서
2. 데이터(Data) & BSS 영역
전역 변수와 전역배열이 저장되는 곳 (static 변수들 포함)( 통틀어 전역객체)
3. 힙(Heap)과 스택(Stack)
스택은 스레드당 하나씩 생성. 컴파일러 설정에 따라 다르지만 보통 기본적으로 스레드당 1MB ~ 4MB정도의 메모리 영역이 스레드 스택공간으로 할당.
스레드가 생성되는 순간 운영체제는 가상 메모리의 남은 영역 중에서 적당한 곳을 골라서 스레드 스택으로 할당.
스택에는 스레드가 실행하고 있는 함수의 인자나 지역변수, 지역 배열들이 저장.
힙은 동적 메모리가 저장되는 곳.(new/malloc과 delete/free)
new delete 관련 글
lvalue rvalue 관련 글