
디스크에 저장되어있는 프로그램을 실행하게 되면 프로그램에 대하 정보를 읽어와 메모리에 로드하게 된다.
그럼 메모리에 어떻게 적재되고 어디에 적재되는가에 대해서 정리해보자.
먼저 메모리는 다음과 같이 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
'컴퓨터 과학 > 개념정리' 카테고리의 다른 글
메모리 단편화 (Memory Fragmentation) (0) | 2024.02.18 |
---|---|
프로그램과 프로세스의 차이 (0) | 2024.02.11 |
오프셋, offset (0) | 2023.02.28 |