[Swift][OS] 메모리 구조에 대하여

Uno·2021년 8월 8일
0

Tip-Swift

목록 보기
14/26
post-thumbnail

iOS 개발자라면,

코드를 작성할 때, 이 코드가 어디에 저장되고 어떻게 동작할지 알아야한다고 문득 생각이 들었습니다.

그래서 메모리 구조에 대해서 간략히 정리해볼까합니다.

메모리구조


그림으로 먼저 전체를 볼게요.

(made by Uno)

프로그램이 실행되면, 다음 4 개의 영역으로OS가 공간을 할당합니다.

(코드 / 데이터 / 힙 / 스택)

코드영역


코드영역은 (소스)코드영역 이라고 생각해도 됩니다.

우리가 코드를 작성하는 그 부분 텍스트 에디터 영역입니다.

우리가 작성한 메모리에 소스코드0,1 로 변경하여 저장합니다.

프로그램을 실행했는데, 그 와중에 코드가 변경된다고 프로그램이 변경되면 안되겠죠.

그렇기 때문에 Read-Only 형태로 저장합니다.

소스코드 → Binary 형태로 저장
Read-Only 형태로 저장

데이터영역


이름이 상당히 직관적이죠. 데이터를 저장하는 영역입니다.

어떤 데이터를 저장하는데?

전역 변수와 정적변수를 저장합니다.

struct Constant {
	static let token = "jwt토큰이다."
}

var userName = "Uno"
var userScore = 99

보통 이런식으로 저장을 하죠.

Constant 내부에 선언된 상수를 보면 static인 부분이 정적변수입니다.

userNameuserScore 는 멤버변수가 아닌 어디에도 속하지 않은 그냥 변수입니다.

→ 전역변수

힙 영역


힙(Heap) 영역의 경우, 프로그래머가 직접 할당하거나 해제합니다.

(malloc / calloc)

하지만 스위프트에서는직접 하지 않고, ARC를 통해서 자동으로 해제해줍니다.

class Adress {
	var postCode: Int?
	var street: String?
}

var unoAdress: Adress = Adress()

이렇게 class를 선언한다면,

위에 제가 그린 그림보면

  • 클래스 인스턴스나 클로저와 같은 Reference Type은 힙에 저장된다.
  • 메모라 크기에 제한이 없다.

의 특징대로

클래스는 힙에 저장합니다.

그리고 unoAdress 스텍에 저장합니다.

스텍 영역


함수를 호출하게되면, 함수 내부 혹은 함수 호출 시 사용되는 값들이 저장됩니다. 그리고 함수가 종료될 때, 이 모든 것들을 메모리에서 해재됩니다.

ex) 지역변수, 매개변수, 리턴 값 등등

스텍 영역에 저장되는 정보들을 스택 프레임(stack frame) 이라고 합니다.

스택은 CPU에서 관리하고 최적화를 하고 있습니다. 그래서 속도가 빠릅니다.(힙에 비해)

func printName(s1: String, s2: String) -> String {
	let message = "\(s1)\(s2)에 오신걸 환영합니다."
	return message
}

s1 과 s2 는 매개변수 → 스택에 할당한다.

message 는 지역변수 → 스텍에 할당한다.

함수 종료와 동시에 메모리 해제

참고자료


https://sihyungyou.github.io/iOS-Memory-Architecture/

https://babbab2.tistory.com/25

profile
iOS & Flutter

2개의 댓글

comment-user-thumbnail
2022년 11월 11일

다들 그림으로 쓰는데 직접 작성한 느낌 너무 러블리해용 ㅎ ㅎㅋㅎ

1개의 답글