티스토리 뷰

메모리 구조

(Memory Structure)




1) 개요


  1.  앱을 만들어서 실행을 하는 과정은 하드 디스크와 같은 저장 공간에 있는 프로그램이 메모리로 올라가 프로세스가 되는 과정과 같다.


  2.  여기서 내가 궁금했던 것은 " 내가 작성한 코드들이 어떻게 메모리 내에서 공간을 차지하고 있을까 ?  " 라는 의문이 생길 수 있다. 

  

  3.  메모리 구조를 살펴봄으로써 이 부분을 해소하고자 한다.

  

  4.  그렇다면 굳이 메모리 구조를 살펴봐야 하나??

  

  5.  최근에는 대용량의 메모리 용량이 탑재되면서 메모리 관리를 정밀하게 해야하는 수준이 감소하기는 했지만, 메모리 관리를 통해 불필요한 메모리는

       제거 해주면서 앱의 성능을 효율적으로 관리해줄 필요성이 있다 !! 메모리가 고용량이 된다고 하더라도 그 안에서 최고의 성능을 내어야 한다 !

       메모리 충돌로 인해서 앱이 튕기거나 하는 상황이 생길 수도 있기 때문인 이유도 있다 !



2) 메모리 구조


  메모리 구조를 나타내는 좋은 그림이 있다.




< 출처 : http://tcpschool.com/c/c_memory_structure >



  이 그림을 이해하는 부분에는 큰 어려움이 없으리라 생각된다. 다만 용어가 어려울 뿐...ㅎ


  하나씩 뜯어보자. 


  낮은 주소 ? 높은 주소 ? 바로 위키백과 검색 가본다.


""


메모리 주소


컴퓨터 과학에서 메모리 주소 메모리 위치에 대한 식별자로, 컴퓨터 프로그램이나 하드웨어 장치가 데이터를 저장하고 나중에 이를 가져오는 장소이다. 일반적으로 이는 이진 형태의 숫자로 되어 있다


출처 : https://ko.wikipedia.org/wiki/메모리_주소


""


  메모리 위치에 대한 식별자 정도만 알면 되겠다. 메모리 위치는 낮은 곳에서 높은 곳으로 이루어져 있구나 정도 생각하자. 


  그 이상은.. 찾아보니 개념도 너무 어렵다. 그래도 혹시 궁금하다면 https://blog.naver.com/playcodingacademy/221169721028



  중요한 것은 각 영역에 대한 설명 !!!! 


  낮은 주소부터 코드(Code) 영역, 데이터(Data) 영역, 힙(Heap) 영역, 스택(Stack) 영역으로 나뉜다. 따로 따로 살펴보자.



* 코드(Code) 영역


 - 쉽게 말하면 우리가 Xcode 를 통해서 작성한 코드가 저장되는 영역입니다. 텍스트 영역이라고도 불립니다. 



* 데이터(Data) 영역


 - 전역(Global) 변수와 정적(Static) 변수가 영역되는 공간입니다.



* 힙(Heap) 영역


 - 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다. ( = 사용자가 직접 관리할 수 있다 )


 - 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다. ( 상위 사진 참고 )


 -  이 곳은 참조 타입(Reference Type) 의 저장 공간이다. Swift 에서는 Class 가 대표적인 참조 타입.


 -  앞서 올렸던 ARC 가 참조 타입의 할당과 해제 시점을 자동으로 관리한다.

    ( ARC 의 경우 컴파일시에 결정이 된다는 점에서 자바의 가비지 컬렉터와는 차이 존재) 



* 스택(Stack) 영역


 - 함수의 호출과 관계되는 지역(Local) 변수와 매개(Parameter) 변수가 저장되는 영역입니다. 함수의 호출과 함께 할당, 완료와 함께 소멸합니다.


 - 이 곳은 값 타입(Value Type) 의 저장 공간이다. Struct(구조체) 나 enumeration(열거형) 이 대표적인 값 타입.


 - 핵심적인 개념으로 LIFO (Last In First Out = 마지막 들어온 애가 먼저 나감) 의 구조를 가지고 있다. 






 - 위의 사진처럼 Push 동작으로 데이터를 저장하고, Pop 동작으로 데이터를 인출합니다. 


 - 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다 ( 상위 사진 참고 )




# Point 1.

 

 Code & Data 영역은 메모리 사용량에 변동이 없다. 앱이 실행되는 동안에 Xcode 상에서 작성한 코드와 변수들이 변할 일은 그냥 없다고 보면 된다.


 앱이 종료될 시에 이 부분은 메모리에서 해제된다.


#  Point 2.


  Code & Data 영역과는 반대로 Stack 과 Heap 영역은 가변적이다. 그렇다면 만약 스택이나 힙 영역이 거대해져서 상호 간의 영역을 침범하게 되면


  어떻게 되는 것일까 ? 만약 스택 영역이 거대해져서 높은 주소로 올라가다가 힙 영역을 침범하면 스택 오버플로우. 그 반대의 경우의 힙 오버플로우


  현상이 발생한다. 예를들면 for 문을 무한히 돌리게 되면 스택 오버플로우가 발생하게 될 것이고, ARC 에 의해서 관리되지 못한 강한 순환 참조와 같은 문제들로


  인해서 힙 오버플로우 현상이 발생할 수 있다.



# Point 3


  메모리 구조를 프로세스와 스레드 개념과 연관지어 생각해 보자. 그리고 컨텍스트 스위칭이란 무엇일까 ? 찾아보기.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함