사용자가 프로그램 실행을 요청하게 되며, 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/