728x90
반응형

디스크에 저장되어있는 프로그램을 실행하게 되면 프로그램에 대하 정보를 읽어와 메모리에 로드하게 된다.
그럼 메모리에 어떻게 적재되고 어디에 적재되는가에 대해서 정리해보자.

프로그램 실행 과정을 간단하게 그려봤다.

 

먼저 메모리는 다음과 같이 4개의 영역으로 구분된다.

그럼 각 영역이 어떤 역할을 하는지 알아보자.

 

 

코드(Code) 영역

코드 영역에는 우리가 작성한 코드가 저장된다. 이때 컴파일이 완료된 상태의 코드(0과 1로 이루어진 기계어)가 할당된다.
예를 들어, 코드 내에 있는 함수나 조건문, 상수 와 같은 코드들이 컴파일되어 메모리에 할당된다.
따라서 CPU 가 작업을 수행할 때 코드 영역에 있는 명령어들을 가져가 실행하게 된다.

 

 

데이터(Data) 영역

데이터 영역에는 전역 변수(global)정적 변수(static) 가 할당된다.
main 함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 해제된다.

 

조금 더 자세하게 살펴보면, 데이터 영역은 데이터 영역과 BSS 영역으로 구분된다고 한다.

데이터 영역은 초기화된 데이터가 할당되고
BSS(Block Stated Symbol) 영역에는 초기화 되지 않은 데이터가 할당된다.

 

 

힙(Heap) 영역

힙 영역에는 동적 변수가 할당 된다. 동적 메모리 할당(Dynamic Memory Allocation)이라고도 부른다.
사용자가 원하는 시점에 변수를 할당하고 해제할 수 있는 영역이다. 따라서, 사용하고나서 반드시 메모리를 할당 해제 해줘야 한다.
그렇지 않으면 프로그램이 종료될 때까지 할당된 메모리가 유지되고 Memory leak 이 발생한다.
영역 중 유일하게 런타임 때 크키가 결정된다.
선입선출(First In, First Out) 구조로 되어있어 가장 낮은 메모리 주소부터 할당된다. (낮은 주소 -> 높은 주소)

 

추가로 Java 언어 같은 경우 메모리를 신경쓰지 않는데 그 이유는 가비지 컬렉션(Garbage Collection) 이라는 기능을 통해
동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 자동으로 찾아 해제하는 기능을 하기 때문이다.
다만 해제하는 과정이 추가로 필요하기 때문에 속도가 저하된다는 문제도 있다.

 

 

스택(Stack) 영역

함수 호출 시 생성되는 지역 변수(local)매개 변수(Argument) 가 저장되는 영역이다.
함수가 호출이 완료되면 저장된 메모리도 해제된다.
CPU 에 의해서 관리되고 최적화되어 있어 속도가 매우 빠르다.
컴파일 타임에 크기가 결졍된다. 따라서, 컴파일할 때 크기가 정해지기 때문에 할당할 수 있는 크기가 제한되어있다.
후입선출(Last In, First Out) 구조도 되어있어 가장 높은 메모리 주소부터 할당된다. (높은 주소 -> 낮은 주소)

 

 

우리가 개발하면서 흔히 볼수 있는 에러 중 하나인 Stack Overflow 라는 에러가 있다.
Overflow 라는 의미는 넘쳐흐른다는 말인데 말 그대로 Stack 영역의 정해진 크기를 넘어가면 에러가 발생하게 된다.
마찬가지로 Heap 이 Stack 영역을 넘어가게 되면 Heap Overflow 가 발생한다.

 

참고 사이트

https://lxxyeon.tistory.com/70

 

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

컴퓨터의 메모리 구조에 대해 알아보자. 먼저, 아래 그림은 프로그램의 정보를 읽어 메모리에 로드되는 과정으로 프로그램이 실행하게 되면 OS는 메모리(RAM)에 공간을 할당해줍니다. 이 메모리

lxxyeon.tistory.com

https://velog.io/@averycode/iOS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-Stack-Heap-Data-Code

 

[iOS] 메모리 구조 (Stack, Heap, Data, Code)

iOS에서의 메모리 구조에 대해 알아보기 (Stack Heap을 위주로)

velog.io

 

728x90
반응형

'컴퓨터 과학 > 개념정리' 카테고리의 다른 글

메모리 단편화 (Memory Fragmentation)  (0) 2024.02.18
프로그램과 프로세스의 차이  (0) 2024.02.11
오프셋, offset  (0) 2023.02.28
복사했습니다!