
사용자가 프로그램 실행을 요청하게 되며, OS는 이 프로그램 정보를 읽어 메모리에 Load 하게 된다. 이렇게 HDD에 로드된 프로그램 코드는 CPU에 의해서 실행되고 메모리를 관리하게 된다.
메모리는 크게 4가지의 영역으로 나뉘게 된다.
소스코드가 기계어 형태로 저장된다.global변수, static변수가 저장된다.
프로그램 시작과 동시에 할당, 종료되면 메모리를 해제하게 된다.
조금 더 자세히 알아보면, 일반적인 메모리의 데이터 영역은 data영역과 bss영역으로 나뉘고 각기 다른 데이터가 저장된다.
- data 영역 : 초기화 된 데이터
- BSS (Block Stated Symbol) 영역 : 초기화 되지 않은 데이터
동적할당영역런타임에 크기가 결정 된다.컴파일타임에 크기 결정Tip ) 컴파일 타임 vs 런타임
- 컴파일타임(Compile Time): 작성한 소스코드를 기계어로 변환하는 과정(컴파일)하는 타임
- 런타임(Run Time): 컴파일이 끝난 프로그램이 사용자가 실행하여 동작하는 타임
- heap 영역은
동적할당영역런타임에 크기가 결정 된다.- 아래쪽(낮은주소 -> 높은주소) 방향으로 메모리 할당
데이터의 크기가 확실하지 않을때 사용전역이다 -> 프로그램의 모든 함수에서 access 가능
- 지역변수, 매개변수, 포인터 등이 저장됨
컴파일타임에 크기 결정- 위쪽 (높은주소 -> 낮은주소) 방향으로 메모리 할당
LIFO : 먼저 생성된 변수가 가장 나중에 해제 됨지역변수만 access 가능heap과 stack은 같은 메모리 영역(free-store라고 명시된 부분)을 공유하게 된다.
heap은 낮은주소 -> 높은주소 방향으로 메모리 할당하고
stack은 높은주소 -> 낮은주소 방향으로 메모리 할당하게 된다.
이러다 보면, heap이 stack의 영역을 침해 (heap overflow) 하거나 stack이 heap의 영역을 침해 (stack overflow) 하게 된다.
overflow 는 사전적으로 넘쳐흐른다는 뜻이다.

iOS 에서는 인스턴스, 클로저 등을 자동으로 heap에 할당해주기 때문에 걱정할 필요는 없지만 혹시 직접 할당 해야하는 경우가 있으면 아래를 참고하자
https://babbab2.tistory.com/25
https://all-young.tistory.com/17
https://gomsik.tistory.com/63
https://developpaper.com/ios-memory-overview/