일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- dataasset
- 크리티컬섹션
- 언리얼가비지컬렉터
- UE_LOG
- 약참조
- 자료구조
- 람다사용정렬
- 델리게이트
- enumasByue
- UELOG
- BFS
- C++최적화
- C++
- moreeffectiveC++
- 정렬
- unorder_map
- 알고리즘
- 언리얼엔진구조체
- map
- 데이터애셋
- 강참조
- 선택정렬
- 애셋로드
- UML관련
- UE4 커스텀로그
- stl
- 정렬알고리즘
- 프로그래머스
- 람다
- 스마트포인터
- Today
- Total
기억을 위한 기록들
[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 관련 글
'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 |