Swift

1.iOS 메모리 구조

Daesiker 2022. 6. 28. 15:30
반응형

1. 개요

xCode를 통해 프로젝트를 만들어 시뮬레이터나 실제기기를 통해 실행을 시키면 해당 운영체제(OS)는 메모리(RAM)에 이 프로그램을 위한 공간을 할당해 준다. 총 4가지의 공간으로 나뉘어져 있는데 코드영역, 데이터 영역, 힙 영역, 스택 영역이 존재한다. 각 영역이 어떤 특징을 가지고 있는지 알아보자

✱ 컴파일 타임(Compiletime) : 우리가 만든 소스코드가 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 과정

✱ 런 타임(Runtime) : 사용자에 의해 실행되어 지며, 응용프로그램이 동작되어지는 시간


1-1. 코드 영역

코드 영역은 프로그램의 소스코드가 기계어(Binary) 형태로 저장되는 영역이다.

컴파일 타임에 결정되고, 중간에 코드가 바뀌지 않도록 읽기전용(Read-Only)으로 저장된다.


1-2. 데이터 영역

데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.

프로그램 시작과 동시에 할당되고 프로그램이 종료되면 메모리가 해제된다.

컴파일 타임에 결정된다.

struct Student {
	//정적 변수
	static let loginedStudent = Student()
}

//전역 변수
var name:String = ""
var address:String = ""

1-3. 힙 영역

힙 영역은 프로그래머가 직접 할당/해제 하는 메모리 영역으로 malloc, calloc으로 힙에 메모리를 할당할 수 있는데 이를 동적 할당이라고 한다.

사용하고 난 후에는 반드시 메모리를 해제해 주어야 하며, 그렇지 않으면 memory leak이 발생한다. Swift에서는 ARC를 통해 자동으로 해제를 해준다.

참조 타입(Class Instance, Closure)들은 모두 힙에 자동으로 할당이 된다.

메모리 크기에 대한 제한이 없고, 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스할 수 있지만, 스택 영역보다 상대적으로 느리다.

✱ malloc : 요청된 메모리의 단일 블록을 할당(메모리를 초기화하지 않음)

✱ calloc : 요청된 메모리의 여러 블록을 할당(메모리를 0으로 초기화 함)

✱ memory leak : 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상


1-4. 스택 영역

스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이다. 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

함수가 실행되면 함수 안에 지역변수, 매개변수, 리턴 값 등등이 메모리에 할당되고 함수가 종료되면 저장된 메모리가 해제 된다.

CPU에 의해 관리가 돼서 속도가 매우 빠르고 메모리를 직접 해제를 해주지 않아도 되는 장점이 있지만 메모리 크기에 대한 제한이 있기 때문에 메모리를 무한히 할당할 수 없는 것이 가장 큰 단점이다.

func add(_ a: Int, _ b: Int) -> Int { //파라미터
	let result = a+ b //지역변수 
	return result
}

힙 영역과 스택영역은 같은 메모리 영역을 공유한다. 힙은 낮은 메모리 주소부터 할당을 받고 스택은 높은 메모리 주소부터 할당을 받는다.

같은 메모리 공간을 사용하기 때문에 힙 영역이 스택영역을 침범하거나, 스택 영역이 힙 영역을 침범하면 오버플로우가 발생하게 된다.

✱ 스택 오버플로우 : 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우 발생 (iOS에서 발생 시 프로그램이 죽어버림)

✱ 힙 오버플로우 : 힙에 너무 많은 메모리를 할당하게 되어 힙 영역을 초과한 경우 발생

 

참조 : https://babbab2.tistory.com/25
반응형