아요 개발 일기

[iOS] 메모리 구조 본문

iOS

[iOS] 메모리 구조

소진이 2022. 12. 30. 12:01

안녕하세요!

오늘은 ARC를 공부하기위해! 기반 지식인 메모리 구조에대해서 공부해보겠습니다!!

어느 언어든 꼭 필요한 부분이기때문에~ 열심히 정리해보겠습니다 :D


 

Memory ?? 🤔

 

프로그램이 실행되면

운영체제(OS)는 메모리(RAM)에 이 프로그램을 위한 공간을 할당해 줍니다.

공간은 총 4가지 (Code, Data, Heap, Stack)으로 나뉘어져 있습니다.

 

 

자, 이제 각각의 영역이 하는 역할에대해

알아볼까요?ㅎㅎ

 

 

1.  코드(Code) 영역

 

 

어려운 내용은 없죠?

여기서 기계어는 1과 0으로 되어있는 2진수를 말하고,

중간의 코드가 변경되는 것을 방지하기 위해 Read - Only 형태로 저장됩니다. 

 

 

2. 데이터(Data) 영역

 

 

데이터 영역은 이름 그대로 

데이터를 저장하는 영역입니다.

 

조금 애매하니,

코드로 한번 같이 봅시다!

 

struct Constant {
	static let language = "Swift" // 정적 변수(상수)
}

var name: String? = "sojin" // 전역 변수
var age: Int? // 전역 변수

 

보통 위와 같은 형식으로 저장을 합니다!

지금까지는 쉽져?.?

 

3. 힙(Heap) 영역

 

 

스위프트에서는 malloc, calloc로 힙에 메모리를 할당한 적이 거의 없어서

다소 생소하죠?

 

그럼 스위프트에서는 힙에 메모리 할당을 하지 않는 것일까요?

아닙니다!

클래스 인스턴스(Class Instance), 클로저(Clouser)와 같은

참조 타입의 값들이

모두 힙에 자동 할당이 됩니다.  

 

또한, 저희는 스위프트 언어를 사용하면서 따로 retain, release 같은 명령어를 사용하여

메모리 해제를 따로 한 적이 없죠??? (Object-C에서는 했었..)

 

그 이유는 스위프트에서

ARC를 통해서 더 이상 참조가 되지 않으면 자동으로 메모리를 해제해주기때문입니다.

 

 

장점  메모리 크기에 대한 제한 없음
 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 가능
단점  할당작업, 해제 작업으로 인한 속도 저하
 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
 힙 경합(두 개 이상 쓰레드가 동시에 접근하려 할 때 Lock이 걸림)으로 인한 속도 저하
 메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)

 

 

이번에도 코드로 잠깐 맛 봅시다!

 

// Class → Heap에 저장
class HeapTest {
	var num: Int?
	var name: String?
}

var heapTest: HeapTest = HeapTest() // Stack에 저장

 

클래스는 Heap에 저장되지만

 

변수에 클래스를 할당하니까 Stack 영역에 저장되네요?

그렇다면,,

스택 영역 공부하러 가봅시다!

 

 

4. 스택(Stack) 영역

 

 

스택은 프로그램이 자동으로 사용하는

임시 메모리 영역을 말 합니다.

 

func printName(s1: String) -> String {
	let message = "\(s1)님 안녕하세요."
	return message
}

// s1 (매개변수) → Stack
// message (지역변수) → Stack

 

우리가 위처럼 함수를 호출하게되면, 

함수 내부 혹은 함수 호출 시 사용되는 값들이

스택에 할당됩니다.

 

그리고 이 모든 것들은

함수가 종료될 때 메모리에서 해제됩니다.

 

 

LIFO(Last In First Out) 데이터 구조

->  먼저 생성된 변수가 가장 나중에 해제

CPU에 의해 관리되고 최적화 됩니다.

 

즉, CPU가 관리하여

속도가 힙에 비해 빠르다는 장점이있습니다.

 

그래서 
시스템에서 당장 실행해야하거나

타이트하게 컨트롤 및 매니징 해야하는 것들을

처리할때 용이하게 사용됩니다.

 

 

장점  CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
 메모리를 직접 해제를 해주지 않아도 됨
단점  메모리 크기에 대한 제한 있음
 지역 변수만 액세스 가능

 

 

언제 힙을 쓰고 스택을 쓸까?

 

 Heap에 할당

데이터의 크기를 모르거나,

스택에 저장하기엔 큰 데이터의 경우

 

그 이외엔 Stack에 할당

-> 인스턴스, 클로저 등 자동으로 힙에 할당하는 것 외에

직접 할당하는 경우

 

하지만 Stack을 너무 남발하여 사용할경우

스택 오버 플로우가 발생

 

iOS에서 스택 오버 플로우 발생 시 어플이 죽어 버릴 수 있음

 

 

 

 

참고 사이트 : https://babbab2.tistory.com/25  

 

'iOS' 카테고리의 다른 글

[iOS] ViewController Life - cycle (생명주기)  (0) 2023.01.02
[iOS] Apple's MVC 패턴  (0) 2023.01.02
[iOS] UIKit  (0) 2023.01.02
[iOS] 동기(Sync) / 비동기(Async)  (0) 2023.01.02
[iOS] 프로그래밍 디자인 패턴  (0) 2022.12.30