메모리 영역을 알아보자!

2022. 7. 25. 15:45swift

1. 메모리 구조

메모리의 구조부터 알아봅시다.

먼저, 프로그램이 실행되면

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

근데 그 공간은 다음과 같이 총 4가지(Code, Data, Heap, Stack)으로 나뉘어져 있습니다. 

메모리

 

코드 영역

 가장 위쪽에 자리 잡은 코드 영역에 대해 알아보겠습니다.

본인이 작성한 소스 코드가 저장되어있는곳입니다.

컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장됩니다.

(컴퓨터는 0,1로 이루어진 언어다...대단하다..)

 

데이터 영역

전역변수, static 변수가 저장된다.

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

실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다.

 

struct hemg {

    static let country = "hemg" //스태틱 변수(상수)로 데이터 영역에 할당

}

var name : String?    // 전역 변수로 데이터 영역에 할당

var age : Int?       // 전역 변수로 데이터 영역에 할당

func fetchDate() {

}

name 과 age는 전역 변수로, country는 static 상수로 데이터 영역에 활당된다!

 

힙 영역

프로그래머가 할당/해제 하는 메모리 영역

프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 "동적 할당" 이라고 한다.

사용하고 난 후에는 반드시 메모리 해제를 해줘야 한다.

그렇지 않으면 memory leak이 발생한다.

Code, Data, Stack 중 유일하게 런타임 시에 결정되기 때문에

데이터의 크기가 확실하지 않을 때 사용하다.

 

중요하다!!

위 글에서 malloc, calloc으로 힙엥 메모리를 할당한다고 했는데,

스위프트에선 위 함수들을 통해 직접 할당할 일이 별로 없어서 친근하지 않을 수 있음

하지만 스위프트에서 우린 언제나 어디서나 힙에 할당하고있다.!

 

클래스 인스턴스, 클로저 같은 참조 타입의 값 들을 통해 이들은 모두 힙에 자동 할당 된다.

또한 위에서 힙 특징으로 힙을 사용하고 나면 반드시 "메모리 해제"를 해줘야 한다고 합니다.

근데 우린 지금껏 스위프트를 사용하면서 클래스 인스턴스 맘대로 생성해서 쓰고 난 뒤에

메모리 해제를 해주는 작업을 안 해왔단 말이다...

스위프트는 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모 없어지면 자동으로 해제해준다.

 

힙의 장점

- 메모리 크기에 대한 제한 없음

- 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있음

힘의 단점

-할당적업, 해제 작업으로 인한 속도 저하

-힙 손상(이중해제, 해제 후 사용 등) 작업으로 인한 속도 저하

-힙 경합(두개 이상 쓰레드가 동시에 접근하려 할때 Lock이 걸림)으로 인한 속도 저하

-메모리를 직접 관리 해야합니다.!(누수가 발생할 수 있습니다.)

 

스택 영역

함수 호출시 함수의 지역변수, 매개변수, 리턴 값 등등이 저장되고, 함수가 종료되면

저장된 메모리도 해제된다.

컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

 

스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.

 

스택은 우리가 자료구조에서 배운 것 그대로 LIFO(last in, first out)데이터 구조이고

CPU에 의해 관리되고 최적화 돼서 속도가 매우 빠릅니다.!

 

스택의 장점

-CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우빠르다.

-메모리를 직접 해제를 해주지않아도 된다.

스택의 단점

-메모리 크기에 대한 제한이 있다

- 지역변수만 엑세스 가능하다.