2023. 7. 7. 04:44ㆍAlgorithm/with C++
0. 참고자료
1. 프로세스 메모리 구조와 할당
Segment 방식은 가상주소(virtual address)인 논리적 주소(logical address)를 사용한다.
프로그램에 따른 상대적 위치를 바탕으로 Offset을 더하는 방식으로 메모리의 물리적 주소(physical address)에 접근한다.
위로 갈수록 조금이라도 더 정적?이라고 할 수 있겠다.
가. 정적 할당
컴파일 단계에서 메모리를 결정하는 것.
- code/ text segment
- Data segment
- BSS segment
Data segment와 BSS segment를 나누는 이유는 데이터를 보다 효율적으로 처리하고 관리하기 위해서다.
기본적으로, 실행 파일은 디스크 상에 위치해 있으며 프로그램이 실행될 때 운영 체제에 의해 RAM으로 로드된다.
이때 Data Segment와 BSS Segment는 다음과 같이 처리된다:
- Data Segment
: 초기화된 전역 변수와 정적 변수를 포함한다.
: 프로그램이 로드될 때, 이러한 값들은 디스크 상의 실행 파일에서 RAM으로 복사됩니다.
: 따라서 이 데이터들은 디스크에 저장되어 있는 상태에서 시작하며, 프로그램이 실행될 때 메모리로 불러와집니다. - BSS Segment
: 초기화되지 않은 전역 변수와 정적 변수를 저장한다.
: 프로그램이 시작될 때, 이러한 변수들은 디스크 상의 실행 파일에 포함되어 있지 않습니다.
: 대신에, BSS 세그먼트는 프로그램이 실행될 때 생성되며, 운영 체제에 의해 메모리 상에 할당되고 모든 변수들은 0으로 초기화됩니다.
Data Segment와 BSS Segment를 구분함으로써, 우리는 초기화된 데이터와 초기화되지 않은 데이터를 분리하여, 메모리를 보다 효과적으로 관리하고, 프로그램의 실행 속도를 향상할 수 있습니다.
출처 : ChatGPT 4.0
나. 동적 할당
런타임 시 메모리를 할당하는 것.
- Heap
- Stack
하나의 함수 호출에 의해 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
Stack은 재귀함수가 호출된다고 했을 때 매번 새로운 스택 프레임을 생성한다.
즉, 기존 재귀함수 내의 지역변수로 선언하게 되면 해당 변수는 독립적이고 다른 함수에 있는 변수에 영향을 끼치지 않는다.
대부분의 시스템에서 기본 스택 크기는 생각보다 작습니다.
따라서, 이 방법으로 큰 배열을 선언하면 스택 오버플로우를 일으킬 수 있습니다.
힙은 스택보다 훨씬 큰 메모리 공간을 가지고 있기 때문에, 큰 데이터 구조를 저장하는 데 적합합니다.
아래 문제를 참고.
'Algorithm > with C++' 카테고리의 다른 글
[C++] fill, memset, memcpy (0) | 2023.07.08 |
---|---|
[C++] iterator (0) | 2023.07.08 |
[C++] 배열과 포인터 (0) | 2023.07.01 |
[C++] pair와 tuple (0) | 2023.07.01 |
[C++] string (0) | 2023.03.20 |