[Memory] 메모리 구조 (code, data, stack, heap)

모리스·2023년 11월 16일
0

메모리 구조

목록 보기
1/1
post-thumbnail

이번 노트에서는 swift ARC에 대해 공부하던 중 메모리 구조를 한번 정리면 좋을 것 같아 작성한다. 추후 swift의 메모리 관리 기법인 ARC에 대해서도 포스팅할 것이다.

이번 노트에서는 메모리 구조에 대해서 알아보자.

❓ 메모리 구조 ❓

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리(RAM)각 영역에 로드 되어야 한다.
이때 운영체제(OS)는 메모리(RAM)에 프로그램을 실행하기 위한 공간을 할당해 준다.
운영체제가 할당하는 영역은 크게 4가지(Code, Data, Stack, Heap)으로 나뉘어져 있다.

코드(Code)영역

메모리의 코드(Code)영역은 실행할 프로그램의 코드가 저장되는 영역이다. 프로그래머가 작성한 코드가 기계어로 저장되며, 이를 CPU가 처리하게 된다.


데이터(Data)영역

메모리의 데이터(Data)영역은 프로그램의 전역 변수와 정적(static)변수가 저장되는 영역이다.
데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 메모리에서 해제된다.


스택(Stack)영역

메모리의 스택(Stack)영역은 함수호출과 관련된 지역변수매개변수, 반환(return)값이 저장되는 영역이다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 끝나면 메모리에서 해제된다. 스택 영역의 메모리 할당은 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

스택 영역은 프로그램이 사용하는 임시 메모리 영역이다. 프로그래머가 함수를 호출하면 운영체제는 내부적으로 함수안에 선언된 매개변수, 지역변수 등을 스택에 할당한다. 그리고 함수가 종료되는 시점에 스택에 저장된 메모리는 모두 해제된다.

또한 스택은 push동작으로 데이터를 저장하고, pop동작으로 데이터를 추출하는 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 추출된다.

스택 영역은 컴파일 시 메모리 영역의 크기가 결정되기 때문에 무한정 할당할 수 없다.
재귀함수를 반복해서 호출하거나 함수가 메모리를 초과할 정도로 메모리를 사용하고 있다면 stack overflow가 발생한다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.


힙(Heap)영역

메모리의 힙(Heap)영역은 프로그래머가 필요할 때마다 사용하는 메모리 영역이다. 이말은 즉 프로그래머가 관리해야하는 메모리 영역을 말한다.

힙 영역은 프로그래머에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역에 메모리를 동적 할당 후 사용하고 난 후에는 반드시 메모리 해제를 해줘야 메모리 누수(memory leak)가 발생하지 않는다.

힙 영역의 메모리 할당은 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.

힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

C언어의 경우 프로그래머가 malloc/free 등으로 메모리를 수동 할당/해제하나, Java,JavaScript는 가비지 컬렉션(Garbage Collection), Swift는 ARC(Automatic Reference Counting)을 통해 프로그래머가 관여하지 않아도 자동으로 메모리를 할당/해제해 준다.


메모리 상호작용

위의 스택(Stack)영역과 힙(Heap)영역에서 메모리가 주소의 방향에 따라 할당된다고 했다.

사실상 스택 영역과 힙 영역은 메모리의 같은 공간을 사용한다. 그말은 즉 스택 영역이 클 수록 힙 영역은 작아지고 반대로 힙 영역이 커지면 스택 영역이 작아지게 된다.

스택 영역 메모리 할당: 높은 주소 >> 낮은 주소
힙 영역 메모리 할당: 낮은 주소 >> 높은 주소

스택과 힙이 같은 공간을 공유하고 있기 때문에 자신의 영역을 벗어나 상대의 영역을 침범하는 overflow가 발생할 수 있다.
스택 영역이 힙 영역을 침범하면 stack overflow, 힙 영역이 스택 영역을 침범하면 heap overflow라고 한다.

참조
https://tcpschool.com/c/c_memory_structure
https://babbab2.tistory.com/25

profile
모바일 앱 개발 노트 :)

0개의 댓글