개요
C++을 공부하면서 정적 메모리 할당과 동적 메모리 할당의 개념을 접하게 되었다. 일반적으로 **변수는 스택(Stack)**에 저장되고, **동적으로 할당한 값은 힙(Heap)**에 저장된다고 한다. 하지만 이 부분이 명확하게 이해되지 않아, 스택과 힙으로 나뉘는 메모리 구조를 정리해 보기로 했다.
1. 메모리 구조
![]() 출처 : https://velog.io/@shindoyeon |
컴퓨터의 메모리(RAM)는 크게 4가지로 코드, 데이터, 힙, 스택 영역으로 나누어져있다.
코드 영역
프로그램의 실행 코드를 저장하는 영역이다. CPU가 실행할 명령어들이 저장된다.
함수, 라이브러리 코드등이 저장된다.
ex) main( ), 사용자 정의 함수, printf( ), scanf( )
데이터 영역
프로그램의 전역 변수와 정적 변수를 저장하는 영역이다. 정적 변수는 한 번 메모리에 할당된 후 프로그램이 종료될 때까지 메모리에 유지되는 변수로 static 키워드를 붙여서 선언한다.
int index;
static float average;
힙 영역
프로그램이 동적으로 할당하는 메모리를 저장하는 영역이다. 런타임 시간내에 결정이 되는 영역으로 크기가 가변적이고 프로그래머가 직접 관리해야한다. 만약 할당 후 해제하지 않는다면 메모리 누수가 발생한다. 스택과 달리 메모리 접근 속도가 비교적 느리다는 단점이 있다. 메모리의 낮은 주소부터 할당이 되고 FIFO(First in, First out)방식으로 동작한다.
int* ptr = new int(3); // 힙에서 메모리 할당
delete ptr; // 메모리 해제
스택 영역
함수 호출과 관련된 데이터를 관리하는 임시 저장소이다. 컴파일 시간내에 결정이 되는 영역으로 함수의 지역변수, 매개변수 전달값, 함수호출시 반환 주소 등이 저장된다. 함수가 호출되면 스택에 데이터가 쌓이고, 함수가 종료되면 자동으로 해제된다. 힙에 비해 접근속도가 빠르다는 장점이 있다. 메모리의 높은 주소부터 할당이 되고 LIFO(Last in, First out) 방식으로 동작한다.
void func() {
int localVar = 10; // 스택에 저장
}
2. 스택과 힙 충돌
![]() 출처 : https://velog.io/@shindoyeon |
힙은 낮은 주소부터 높은 주소로 할당이 되는 구조이고, 스택은 높은 주소부터 낮은 주소로 구조이기때문에 두 영역 간에 충돌이 발생할 수 있다. 힙이 스택의 영역을 침범하는 경우를 Heap Overflow, 스택이 힙의 영역을 침범하는 경우를 Stack Overflow라고 부른다.
느낀 점
이번 공부를 통해 메모리 구조뿐만 아니라 각 메모리 영역의 특징도 알게 되어, 앞으로 코드를 작성할 때 더 유연하게 접근할 수 있을 것 같다. 덕분에 최적화와 관련된 코드 작성에서도 한층 더 능숙해질 수 있을 것 같다.
운영체제를 다시 공부하면서 느낀 점은, 알면 알수록 흥미롭고 신기하다는 것이다. 이런 매력 덕분에 운영체제를 더욱 재미있게 공부할 수 있을 것 같다.
'컴퓨터 과학 > 운영체제' 카테고리의 다른 글
[운영체제] 멀티프로세스와 멀티스레드 (0) | 2025.02.03 |
---|---|
[운영체제] 프로세스의 실행 과정 (0) | 2025.01.24 |
[운영체제] 프로세스의 종류 (0) | 2025.01.24 |
[운영체제] 운영체제란 (0) | 2025.01.23 |
[운영체제] 32비트 vs 64비트 (0) | 2024.12.23 |