프로그래밍 언어/C#
메모리 구조
가든_
2023. 10. 2. 22:54
메모리 구조란 프로그램을 실행하기 위해 OS로부터 할당받는 메모리 공간이다.
코드영역, 데이터 영역, 힙 영역, 스택 영역, 기타 영역으로 나뉜다.
메모리 구조

코드 영역
- 프로그램을 실행할 코드가 있는 공간
- 프로그램이 메모리에 로드될때 읽힌다.
데이터 영역
- 프로그램의 전역 변수, 정적 변수를 저장하는 공간
- 전역 변수(global) : 프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수
- 어디서든 접근 가능하다.
- 정적 변수(static) : 프로그램이 종료되기 전까지 메모리가 소멸되지 않고, 딱 한번만 초기화가 진행되는 변수
- 정적 지역변수, 정적 전역변수에 따라 사용 범위가 제한된다.
- 전역 변수(global) : 프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수
- 프로그램 시작시 할당되고, 종료되면 소멸된다.
힙 영역
- 동적 메모리 영역
- 일반적으로 사용자가 직접 관리한다.
- 힙 메모리의 할당 및 해제는 프로그램 코드 내에서 사용하는 메모리 관리 함수 또는 연산자를 사용하여 수행된다.(C/C++의 malloc, free, C#의 new, delete...)
- C#이나 Java같이 가비지 컬렉터가 있는 언어를 사용하면 힙 메모리 관리가 가비지 컬렉터에 의해 수행된다.
- 가비지 컬렉터는 프로그래머가 명시적으로 메모리를 해제하지 않아도 사용하지 않는 객체를 자동으로 정리한다.
❓ 그럼 OS는 전혀 힙 메모리에 관여하지 않을까?
- NO! OS가 힙 메모리 사용과정에서 오류를 감지하거나 프로그램의 메모리 사용량을 제한하기 위해 보호 메커니즘을 제공할 수 있다. 하지만 보통은 사용자 레벨에서 힙 메모리 관리가 수행됨. 고로 직접적 개입은 거의 없다.
- 낮은 주소 -> 높은 주소 방향으로 할당한다. (증가하는 방향)
- 메모리 크기 제한이 없다.
- 기본적으로 메모리 제한이 없지만, 실제로 사용 가능한 크기는 물리적 메모리 및 가상 메모리 제한, 운영 체제 및 프로세스 제한, 힙 메모리 관리에 따라 달라질 수 있다.
자료구조 힙
- 최대 값, 최소 값을 찾아내는 연산을 빠르게 하기위한 자료구조
- 완전 이진 트리 기반
- 최대 힙 : 부모 > 자식
- 최소 힙 : 부모 < 자식
스택 영역
- 프로그램의 함수 호출 및 지역 변수, 매개 변수가 저장되는 영역
- 함수 호출시마다 스택 프레임을 생성해서 매개 변수, 지역 변수를 관리한다.
- 스택 프레임은 매개변수, 지역변수, 복귀 주소, 이전 프레임 포인터로 구성된다.
- 스택 프레임은 함수 호출시 생성되며, 해당 함수의 매개 변수 및 지역 변수를 저장한다.
- 스택 프레임은 함수 실행이 완료되면 제거되며, 복귀 주소를 사용해서 이전 상태로 돌아간다.
- 그렇기 때문에 변수의 명시적 할당해제가 필요없다.
- 높은 주소 -> 낮은 주소 방향으로 할당한다. (감소하는 방향)
- CPU에 의해 공간이 관리된다.
자료구조 스택
- 가장 최근에 저장된 데이터가 가장 먼저 인출되는 자료구조(LIFO)
- Push를 통해 데이터를 저장하고 Pop으로 데이터를 인출한다.