본문 바로가기
CS/OS

Swift에서의 메모리 관리

by 지금갑시다 2022. 8. 28.

먼저 메모리 관리에 앞서 메모리가 뭘까?

 

노트북을 사게 될때, 은 몇기가가 좋아요? 8g? 16g? 와 같은 말을 하게 된다.

이때 이 이 바로 우리가 말하는 메모리이다!

 

램(메모리)이란, '그 용량이 크면 클수록 저장할 수 있는 공간이 커져 동시에 여러 일을 더 잘 할 수 있게 만들어 준다 '라고 이해하면 아주 간단한 이해다. + 프로그램이 실행되는 동안, 필요한 정보를 저장해 컴퓨터의 빠른 연산에 도움을 준다고 생각하면 된다.

 

 실제로 프로그램이 실행되려면, 메모리에 프로그램이 올라간다. 라는 표현이 있는데, 이는 실행시킨 프로그램의 명령어들과 실행되는데 필요한 데이터들이 메모리에 위치한다 라고 이해하면 된다!

 

컴퓨터를 사용할때, 언제나 우린 메모리를 사용하고 있다. 그러나 그 메모리는 한정된 재화이기에, 한정된 메모리 공간 안에서  이 메모리를 얼만큼 효율적으로 쓰는지가 굉장히 중요하다.

 

따라서!

프로그램을 만들때, 우린 이 메모리가 어떻게 이용되고 있는지 알고 만든다면, 굉장히 더 딥하게 학습과 최적화가 가능해진다!

 

 

그래서, 이 메모리는 어떤 구조를 가지고 있고, Swift로 개발을 하며 어떤 점을 생각해보면 좋을까 같이 알아보자!

 

메모리 구조

이미지 출처: https://iamnotokay.tistory.com/57

 

메모리는 대략 위와 같은 분할된 공간을 가지고 있는데, 

 

1. Code

Code는 우리가 개발을 하며 쓴 코드 자체이고, 기계어 명령들을 가지고 있으며, 변화시킬 필요가 없어, Read only인 특징을 가지고 있다.

 

2. Data 

Data는 정적인 변수들, 전역변수 들이 프로그램의 시작과 동시에 할당이 되게 된다. 예를 들면 static 관련 혹은 말그대로 전역변수들..

이 변수들은 실행도중에도 바뀔 수 있는 값이기에, Read and Write가 모두 가능한 부분이 된다.

 

3. Heap 

여기서부터는 컴퓨터 공부를 하다보면, 꽤 들어본 부분이다.

Heap! 동적인 데이터를 가지고 있으며, '동적이다' 라는 것은 프로그램이 실행되고 값이 추가되거나 바뀔 수 있으며, 또한 그렇게 되는 데이터들은 프로그램이 실행되는 도중에 생성되어 메모리에 올라가게 된다.

 

보통 Reference타입들이 속하게 되는데 Class의 인스턴스들, Closure, String, Array 가 이 메모리 부분에 올라오게 된다.

 

Heap부분에 올라오는 데이터들은 생성될때, 메모리에 올라오게 되고, Swift의 내부 ARC로 인해 참조 카운팅이 이뤄지므로, 더이상 사용되지않게 되면(자신을 참조하는 값들이 사라졌을때), 자동으로 Heap에서 메모리 해제가 되기도 한다!

 

주의해야 할 점은, 여러 쓰레드가 동시에 하나의 값을 접근하려하면 값의 동기화를 쓰레드에서 맞춰주어야 하기에! 해당 메모리에 접근하는 속도가 저하 될 수 있다.

 

4. Stack 

마지막으로 Stack!

Stack은 자료구조에서 흔히 통용되듯 FILO(First In Last Out)의 데이터 누적의 모습으로 메모리가 저장되며, Stack에 올라가는 데이터들로는

함수안의 지역변수, 매개변수, 리턴 값 등이 올라가게 된다.

 

Stack의 경우 임시메모리 저장소라고 보면 되는데, 이는 함수가 실행됨과 동시에 메모리에 올라가게 되고, 함수를 빠져나옴과 동시에 메모리Stack에서 빠지므로, 그 속도가 매우 빠르게 진행됨이 특징이다.

 

그러나, Stack에 너무 많은 메모리를 담게 되면, 우리가 잘 아는 Stack overflow가 일어나게 되는데 이는 자신이 감당할 수 없는 범위 넘어로 메모리가 늘어나 앱이 꺼질 수 있기 때문에 필히! 조심해야한다! ( ex. 재귀함수 혹은 탈출구문이 있어야 하는 코드들이 비정상적으로 작동하게 되면 이렇게 된다!)

 

Heap과 Stack

"아니 선생님 힙오버 플로우도 있잖아요?!"

맞다.. Heap과 Stack은 사실 위 이미지처럼 분절된 메모리공간이 아니라 한 공간을 나누어 쓰는데, 그래서 위의 사진에 Stack이 높은 주소번지부터 내려오며 데이터를 쓰게 되고, 반대로, Heap은 낮은 주소번지부터 올라가다가 만나고, 자신의 바운더리를 넘어가게 되면, Heap overflow가 생길 수 있기 때문에 조심해야 한다.

 

Heap은 동적으로 생성되고, 메모리 해제가 일어나므로 Stack에 쌓이는 데이터보다 오랜 시간이 걸리게 된다.

그러나. Stack은 메모리가 한정되어 있어 너무 큰 메모리를 할당하지 못하기에 작은 데이터들은 Stack에 쌓고 데이터 크기를 모르거나 너무 큰 데이터의 경우에는 Heap 메모리를 사용하는 것이 좋다!

 

정리

상위 내용을 생각하며 코딩을 해 나의 코딩 수준 레벨 업! 을 노려보자!

 

끗!

 

REF: https://babbab2.tistory.com/25

REF: https://iamnotokay.tistory.com/57