관리 메뉴

기억을 위한 기록들

[Fundamental C++] 3. 메모리 본문

C & CPP/Fundamental C++

[Fundamental C++] 3. 메모리

에드윈H 2021. 4. 27. 17:30

가상메모리

핵심은 각각의 프로세스에게 메모리 공간이 독립적으로 부여된다는 것.

개별 프로세스는 부여받은 메모리 영역은 해당 프로세스만이 접근할 수 있도록 보호된다. 독립적으로 부여되어 타 프로세스가 해당 메모리 영역을 침범할 수 없고, 안정성을 크게 향상

 

가상메모리의 크기

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 관련 글

hyo-ue4study.tistory.com/337

 

[CPP-effective] 3-4 new및 delete를 사용할 때는 형태를 반드시 맞춘다.

string* str = new string[100]; //.. delete str; 얼핏 보면 맞는 것 같지만 str이 가리키는 100개의 string 객체들 가운데 99개는 정상적인 소멸을 거치지 못할 가능성이 크다. new 연산자를 사용해서 표현실을..

hyo-ue4study.tistory.com

 

lvalue rvalue 관련 글

hyo-ue4study.tistory.com/318

 

lvalue와 rvalue /rvalue 참조와 이동생성자,이동대입연산자 사용

lvalue 란? 단일 식을 넘어 지속되는 개체 - 주소가 있다. - 이름이 있는 변수 - const 변수 - 배열 변수 - 비트 필드(bit-fileds) - 공용 구조체(unions) - 클래스 멤버 - 좌측 값 참조(&)로 반환하는 함수 호출

hyo-ue4study.tistory.com

 

 

 

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

[Fundamental C++] 5. 배열  (0) 2021.04.27
[Fundamental C++] 4. 포인터  (0) 2021.04.27
[Fundamental C++] 2. 빌드  (0) 2021.04.27
[Fundamental C++] 1. 선언과 정의  (0) 2021.04.27
쓰기에 앞서  (0) 2021.04.14