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