본문 바로가기
iOS📱/Common

[ iOS ] 메모리 구조 ( Code, Data, Stack, Heap )

by 텅빈비니 2023. 1. 4.
반응형

안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻‍♂️ 입니다.

오늘은 메모리구조에 대해 알아보는 시간을 가지겠습니다.

 

1. 개요

운영체제(OS)는 메모리에 공간을 할당을 해줍니다. 대표적으로 아래와 같이 4가지로 나뉘어져 있습니다.

 

메모리 구조

오늘은 위의 총 4가지 메모리 영역에 대해 각각이 어떤 역할을 하는지 알아보겠습니다. :)

 

2.  메모리 구조

2-1. 코드(Code) 영역

1. 우리가 작성한 소스 코드가 기계어 형태로 저장된다.
2. 컴파일 타임에 결정되고, Read-Only의 형태로 저장된다.

코드 영역

기계어라고 하면은 컴퓨터가 이해할 수 있는 언어로 0, 1 로 이루어진 이진법 언어입니다.

 

2-2.  데이터(Data) 영역

1. 전역변수, Static 변수가 저장된다.
2. 프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리에서 해제된다.
3. Read-Write의 형태로 저장된다.

데이터 영역

 

실제 소스를 통해 확인해보겠습니다.

struct Person {
    static let home = "Seoul"   // (1)
}

// (2)
var name: String?
var age: String?
  1. Static 변수(상수)로 데이터 영역에 할당됩니다.
  2. 전역 변수로 데이터 영역에 할당됩니다.

 

2-3.  힙(Heap) 영역

1. 개발자가 직접 할당/해제하는 메모리 영역이다.
2. 개발자는 malloc, calloc 을 통해 메모리 할당 => 동적할당
3. 직접 할당 해제가 필요하기 때문에 적절한 시기에 해제를 하지 않으면 메모리 누수 발생한다.
4. 런타임시 할당되고, 데이터의 크기가 확실하지 않을 때 사용한다. 

힙 영역

우리는 언제 어디서나 힙 영역에 메모리 할당을 해주고 있습니다.

바로 클래스, 클로저 같은 참조 타입의 값!  => 이러한 값들은 자동으로 힙 영역에 할당됩니다.

 

위 3번의 설명대로 개발자는 직접 메모리 해제를 해주지 않으면 메모리 누수가 발생합니다.

다만 우리는 release 나 free를 사용해본 적이 없을 것이라 생각합니다.

 

왜냐?! :-)

 

스위프트에서는 ARC를 통해 힙 영역에 할당된 메모리가 더 이상 참조를 하지 않으면 자동으로 해제를 해주기 때문입니다.

 

ARC 관련 포스팅은 참고해주세요

 

[ Swift ] ARC (1) 기본 개념, Reference Count 이해

안녕하세요 🐶 빈 지식 채우기의 비니🙋🏻‍♂️ 입니다. 오늘은 ARC의 기본 개념과 Reference Count에 대해 알아보는 시간을 가지겠습니다. 1. 개요 ARC ( Auto Reference Counting ) : 말 그대로 '자동 참조

beanistory.tistory.com

 

여튼 힙 영역에 대해 큰 특징을 확인하였습니다. 그에 따른 장단점은 아래와 같습니다.

장점  메모리 크기에 대한 제한이 없습니다.
∙ 프로그램 모든 함수에서 엑세스
가 가능합니다.
단점  개발자가 직접 할당 해제를 하기 때문에 속도면에서 저하가 일어날 수 있습니다.
메모리를 직접 관리를 해줘야 합니다. ( 메모리 누수 발생 위험 )

확실한 단점은... 네 그렇습니다 바로 속도입니다

 

2-4.  스택(Stack) 영역

1. 함수 호출 시 지역변수, 매개변수, 반환 값들이 스택 영역에 저장이 된다.
2. 함수가 종료되면 저장된 메모리도 해제가 된다.
3. 컴파일 타임에 결정이 된다.

스택 영역

스택은 프로그램이 자동으로 할당 해제을 해주는 임시 메모리 영역 같은 느낌입니다.

func getName(age: String) -> String {	// (1)
    let name = self.name	// (2)
    
    print("내 이름은 \(name)이고, 나이는 \(age)입니다.")
    
    return name
}
  1. 매개변수 및 파라미터는 스택 영역에 할당됩니다.
  2. 지역 변수로 스택 영역에 할당됩니다.
  3. getName 함수가 끝나는 시점에 스택에 저장된 메모리는 자동 메모리 해제가 됩니다.

 

힙과 마찬가지로 스택 영역 또한 장단점이 존재합니다.

장점 CPU가 스택 메모리 효율을 구성하기 때문에 속도가 매우 빠릅니다.
 메모리를 직접 해제를 안해줘도 됩니다.
단점  메모리 크기 제한이 있습니다.
∙ 지역 변수만 엑세스 가능합니다.

스택은 메모리 크기 제한이 있기 때문에 무한정 할당이 불가능합니다.

 

3. Stack vs Heap

힙 ( Heap)  데이터의 크기를 모르는 경우
∙ 스택에 저장하기엔 큰 데이터의 경우
힙 또한 자신의 영역 외로 확장하면 Heap Over Flow 발생
스택 ( Stack )  힙에 저장되어야 할 이외의 경우
∙ 빠른 속도를 원하는 경우
스택에 너무 많은 메모리 할당하면 Stack Over Flow 발생

 

4. 정리

오늘은 4가지의 메모리 영역에 대해 알아보았습니다.

우리가 개발을 하다가 내용을 몰라도(?) 자연스럽게 다양한 메모리 영역을 쓰고 있다는 것을 알 수 있는데요.

나 진짜 개념 몰랐음...:(

 

오늘 포스팅의 가장 중요한 것은 힙(Heap) 과 스택(Stack) 입니다.

적절한 메모리 영역에 할당해야 프로그램 성능도 좋아지니깐요 ㅎㅎ

 

이상으로 메모리 구조 ( Code, Data, Stack, Heap ) 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~

 


참고

반응형