코드를 잘 쓰는 것도 중요하지만 우리가 적은 코드들이 어떤 메모리 영역에 들어가서 관리되는지
이해하는 것도 중요하다. 그래서 오늘은 메모리 구조에 대해 살펴보고자 한다.
1. 메모리 구조
메모리의 구조는 크게 4가지 영역으로 나눠져있다.
1. 코드 영역
프로그램의 실행 코드가 저장되는 공간이며 텍스트 영역이라고 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
2. 데이터 영역
전역 및 정적 변수를 저장하는 공간이며 특정 함수나 개체의 인스턴스에 연결되지 않았다.
프로그램이 시작할 때 함께 할당되며, 프로그램이 종료되면 소멸된다.
3. 스택 영역
함수의 호출 및 지역 변수와 매개변수를 관리하는 영역.
함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸된다.
스택은 가장 최근에 할당된 메모리가 가장 먼저 할당 해제되는 LIFO(후입선출) 방식을 따른다.
단순한 구조와 LIFO할당으로 스택 메모리에 대한 액세스가 힙 메모리보다 빠르다.
쓰레드 생성시 고유의 스택 메모리가 생성된다. -> 쓰레드 간의 스택 메모리 데이터 공유 불가
높은 주소에서 낮은 주소의 방향으로 할당.
4. 힙 영역
힙은 동적으로 크기가 정해지지 않는 데이터를 위한 메모리 할당에 사용된다. -> 동적 할당
C, C++에서는 malloc, free 함수를 사용하여 사용자가 직접 관리하고, 그 외의 언어들은 가비지 컬렉션과
같은 메커니즘을 통해 관리한다.
스택과 달리 함수의 범위를 벗어나도 존재할 수 있다.
낮은 주소에서 높은 주소의 방향으로 할당하는 포인터 역참조로 스택에 비해 속도가 느리다.
힙의 크기는 스택보다 크며, 동적으로 조절될 수 있다.
2. 스택 오버플로우
그럼 스택영역을 사용할 때 생길 수 있는 문제가 있는데 그것이 바로 스택 오버플로우(Stack Overflow)다.
스택 오버플로우는 주로 스택에 저장할 수 있는 데이터의 양을 초과하여 삽입하려고 할 때 발생하는 오류다.
스택은 한정된 크기의 메모리영역을 사용하기 때문에 스택에 쌓인 데이터가 일정 크기를 초과하면 스택 오버플로우가 발생한다. -> 스택 영역도 크기가 제한되어 있고 그렇기에 힙 영역보다 크기가 제한적인 대신 속도가 빠르다.
주로 재귀함수와 같은 크기를 벗어나기 쉬운 부분에서 스택 오버플로우가 많이 발생하기 때문에 이를 방지하려면 함수 호출에 사용되는 메모리를 신중하게 관리하고 스택에 저장되는 데이터의 양을 스택의 크기에 맞게 조절하는 것이 중요하다.
'TIL > C#' 카테고리의 다른 글
[Unity] 디버그를 하는 이유와 방법 (디버깅) (0) | 2023.12.04 |
---|---|
[C#] 인터페이스와 추상클래스에 대하여 (1) | 2023.11.15 |
[C#] 오버로딩과 오버라이딩 (0) | 2023.11.14 |
[C#] 객체지향 (OOP, SOLID) (0) | 2023.11.13 |
[C#] 스택, 힙 메모리란 무엇인가 (0) | 2023.11.10 |