메모리 구조에 대해서 알아보기!
우선 메모리 구조에 대해서 알아보기 전에 프로그램이 어떤 방식으로 동작하는지 알아보도록 하겠습니다
사용자가 프로그램 실행 요청을 하면 운영체제는 보조기억장치에 저장되어 있는 프로그램 정보를 CPU에게 전달하고 메모리에 로드 시킵니다 이때 OS는 메모리(RAM)에 공간을 할당해 줍니다
이제 물리적 메모리 공간에 대해서 알아보도록 하겠습니다
할당받은 메모리 공간은 4가지영역(Code, Data, Stack, Heap)으로 구성됩니다
코드(Code) 영역우리가 작성한 소스코드가 들어가는 부분! 다시말해서 실행할 프로그램의 코드가 저장되는 영역 입니다(텍스트영역이라고도 부름)
코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 처리하게 됩니다
전역 변수와 static 변수가 할당되는 영역입니다
프로그램의 시작과 동시에 할당되고 프로그램이 종료 되어야지만 메모리 영역이 소멸됩니다
import Foundation
var a: Int = 10; // 데이터 영역에 할당
var b: Int = 20; // 데이터 영역에 할당
func dataFunc() -> Bool {
return true
}
메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
func someFunc1(c: Int) {
int d = 30;
// 매개변수 c와 지역변수 d가 스택영역에 할당
}
void someFunc2(e: Int) {
int f = 40;
// 매개변수 e와 지역변수 f가 스택영역에 할당
}
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
프로그램 실행시에는 프로그램 내의 가비지 컬렉터가 자동으로 해제합니다
프로그램 종료시에는 OS 가비지 컬렉터가 자동으로 해제 합니다
이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.
힙과 스택은 같은 공간에서 처리되기 때문에 각자의 영역을 침범하게 되면 오버플로우가 발생!