본문 바로가기

iOS/iOS

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

 

안녕하세여~~  소들입니다 :-)))))

 

오늘 웬 듣보잡 버그 한 놈이 나왔는데

처음에 메모리 참조 오류인 줄 알고 하루 종일 메모리에 대해서 공부 했는데 

버그 원인은 메모리가 아니었음ㅋ (디코딩 네이놈)

 

쨌든  의도치 않게

메모리 구조나 ARC에 대해 기본부터 심화까지

자세히 공부할 수 있던 뜻깊은 시간이라

잊지 않기 위해 포스팅으로 남겨보려 함 :)

 

 

먼저 가볍게 

메모리 구조에 대해서 고고~!!

 

 

 

 

1. 메모리 구조

 

 

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

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

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

 

 

 

 

컴퓨터를 전공했다면 안 들어봤을 수가 없을테지 후후 

 

오늘은 ARC에 대해 다루기 전에

이 메모리 공간에 대해 짚고 넘어갈 것임

 

각 영역이 어떤 역할을 하는지

알아봅시다 :-)

 

 

 

 

 

 

1-1. 코드(Code) 영역   

 

 

기계어라 함은 컴퓨터가 읽을 수 있는 가장 밑단의 언어로

0,1로만 이루어진 언어임

 

설명 충분쓰

어려운 거 없쓰

 

 

 

 

 

 

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

 

 

 

Swift 예제로 봐보자 :-)

 

 

 

name과 age는 전역 변수로, country는 static 상수로, 

데이터 영역에 할당됨!

 

+ 음 근데 swift에서 static은 기본 동작이 lazy잖아요?

위 설명은 일반적인 프로그래밍에서인데, swift에선 아마 static의 경우엔

프로그램 시작과 동시에 할당되어 메모리에 올라가진 않고,

해당 값에 처음 접근할 때 값이 할당되어 메모리에 올라갈 것 같움..

 

 

 

 

1-3. 힙(Heap) 영역    

 

 

 

아따 설명 많다

그만큼 중요하단 뜻임

 

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

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

 

하지만 스위프트에서 우린 언제나 어디서나

힙에 할당하고 있었음!!

 

언제?

 

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

참조 타입의 값

 

들은 통해!! 이들은 모두 힙에 자동 할당 됨!!

 

 

또한 위에서 힙 특징으로

힙을 사용하고 나면 반드시 "메모리 해제"를 해줘야 한댔음

 

근데 우린 지금껏 스위프트를 사용하면서

클래스 인스턴스 맘대로 생성해서 쓰고 난 뒤에 메모리 해제를 해주는 작업을 안 해왔단 말임!?

인스턴스 다 쓰고 free, release 같은 거 해준 적 없잖음!!

왜냐 ㅎㅎㅎ?

 

스위프트는 ARC를 통해 힙에 할당된 메모리가

더 이상 쓸모 없어지면(참조되지 않으면) 자동으로 해제해주기 때문!!!! :)

 

지금은 이해 못 함!

그러나 이것에 대해 공부하기 위해 

지금 이 메모리 영역에 대해 공부하는 것임!!

 

이는 다음 포스팅에서 ~_~

 

 

 

힙의 특징에 대해 알았으니

그에 따른 장점 단점은 다음과 같음

 

 

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

 

.. 명확한 단점 그것은 속도..

(근데... 막 엄청 느린 게 아니라.... 스택보다 상대적으로 느리단 개념임)

뭐 .. 그렇답니다 :)

 

 

 

 

 

 

1-4. 스택(Stack) 영역   

 

 

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

임시 메모리 영역임

 

 

우리가 아무렇지 않게 함수를 호출하면

 

 

 

OS는 내부적으로 함수 안에 선언된 

파라미터, 지역변수 등을

스택에 할당함

 

그리고 위 add 함수가 종료되는 시점에

스택에 저장된 메모리는 모두 알아서 반환됨

 

 

또한 스택은 우리가 자료구조에서 배운 것 그대로

"LIFO"(last in, first out) 데이터 구조이고

(먼저 생성된 변수가 가장 나중에 해제됨)

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

 

그럼 단점도 있겠지?!

스택에 대한 장, 단점을 정리하면

다음과 같음

 

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

 

스택은 메모리 크기에 대한 제한이 있기 때문에

메모리를 무한히 할당할 수 없는 것이 가장 큰 단점임 ;< 

 

 

 

 

 

2. 힙 vs 스택

 

2-1. 언제 힙을 쓰고, 언제 스택을 쓰나요?

 

위에서 장, 단점을 보면 알 수 있셈

 

스택은 메모리가 한정되어 있기 때문에

너무 큰 메모리는 할당할 수 없음

 

때문에 

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

스택에 저장하기엔 큰 데이터의 경우엔 힙에 할당 하고

그 외엔 스택에 할당하면 됨

(인스턴스, 클로저 등 자동으로 힙에 할당되는 것 외에

직접 할당할 경우!)

 

 

 

만약에~~

스택에 너무 많은 메모리를 할당하게 되면~~~

어케 되냐면~~~

 

 

 

여기서 등장하는

코딩할 때 손과 발이 되어주는 

 

스택 오버 플로우

 

가 발생함

이 스택 오버 플로우란 것은

 

스택에 너무 많은 메모리를 할당하게 되어

자신의 스택 영역을 초과한 경우

 

을 말함!!!

iOS에서 스택 오버 플로우 발생 시 어플 죽어버리니까 조심해야 함

(무한 재귀 같은거 호출해보면 stack overflow라면서 죽음!)

 

 

 

 

2-2. 힙과 스택의 메모리 관계

 

지금껏 위에서 힙과 스택을 나누어서 설명 했지만,

사실..

 

힙과 스택은 같은 메모리 영역을 공유함!!!!

 

 

 

 

이런 식으루!

 

같은 메모리 공간이지만

힙 영역낮은 메모리 주소부터 할당 받는 것이고,

스택 영역높은 메모리 주소부터 할당 받는 것임

 

 

따라서 힙 또한 자신의 영역 외로 확장하려다 보면,

힙 오버 플로우라는 것이 발생함 :)

 

.

.

.

 

 

오늘은 왠지 대학교 컴퓨터 구조 시간에 배운 것만 같은

메모리 영역에 대해 공부해봤어여 :-)

 

오늘 이 부분에 대해 완벽히 이해하고 넘어가야

다음에 공부할 ARC를 완벽 이해할 수 있기 때문에!

 

혹시라도 이해 안 된다면 두 번 보시고

잘못된 정보나 모르겠는 부분은 댓글 남겨주시면 감사링 :D

 

 

 

그럼 20,000

 

 



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday