일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- interpace
- 코딩테스트
- 이니셜라이저
- property
- struct
- UIKit
- 디자인패턴
- url
- 스위프트
- Class
- Method
- optional
- Terminal
- Foundation
- init
- Xcode
- enum
- initalizer
- Unicode
- Swift
- type
- Protocol
- instance
- IOS
- tuist
- String
- delegate
- initializer
- Git
- extension
Archives
- Today
- Total
아리의 iOS 탐구생활
메모리 구조에 대해서 알아보자. 본문
반응형
메모리 구조에 대해서 알아보기전에 메모리의 대한 내용 먼저 다루기
데이터나 프로그램을 저장하는 저장 공간은 계층 구조를 가진다.
CPU에서 가장 가까운 저장공간은 레지스터인데,
레지스터 -> CPU 캐시 메모리 -> 메인메모리 -> 보조기억장치 -> 외부기억장치 순으로 멀어진다.
CPU로부터 멀어질수록 데이터를 저장하는 용량이 커지고 접근 속도는 느려진다.
ROM은 Read Only
RAM은 Read / Write 가능
메모리 구조
스택(Stack)
- 먼저 들어간건 나중에 나온다. (LIFO 후위선출 구조)
- 할당과 해제를 반복하기 때문에 데이터 용량이 불확실하다.
- 메모리의 높은 주소부터 낮은 주소 순으로 할당 된다.
- 함수에 포함된 지역변수들만 접근할 수 있다.
- 컴파일 시에 할당될 영역의 크기가 결정된다. 정해진 크기를 넘어 할당할 수 없다.
- 함수를 호출할때마다 정보가 쌓인다. 함수의 호출이 완료되면 소멸한다.
힙(Heap)
- 프로그래머가 할당하고 해제해주는 영역. malloc, calloc 등 해제 기능이 필요하다.
- 런타임 시에 Heap영역의 크기가 결정되기 때문에 데이터 크기가 확실치 않을 때 사용된다.
- 낮은 주소에서 높은 주소 순으로 할당 된다.
- 스택보다 할당할 수 있는 메모리 공간이 많다는 것이 장점이지만 포인터로 메모리 영역을 접근해야 하기 때문에 다른 자료구조에 비해서 데이터를 읽고 쓰는게 느리다.
- 동적으로 할당되는 변수들이 할당되고 해제된다.
- 메모리 해제를 해주지 않으면 memory leak 발생한다. (동일 메모리 블록 중복 할당 방지 필요)
Swift는 ARC를 통해 힙에 저장된 메모리가 더이상 참조하지 않게되면 자동으로 해제해준다.
스택(Stack)과 힙(Heap)의 관계
- 스택과 힙은 같은 공간을 사용한다.
- 그래서 Stack 영역이 클 수록 Heap 영역이 작아지고, 반대로 Heap 영역이 클수록 Stack 영역이 작아진다. (반비례)
- 같은 공간을 사용하기 때문에 서로 자신의 영역이 상대의 영역을 침범하는 사태가 발생할 수 있다.
- Stack overflow: 스택이 힙의 영역 침범
- Heap overflow: 힙이 스택의 영역 침법
- Stack 영역에서 말하는 할당은 이미 생성된 공간에 대해 포인터의 위치만 바꿔주는 단순한 CPU Instruction이기 때문에 할당 속도가 빠르다.
- Heap 영역에서 말하는 할당은 요청되는 양과 현재 메모리 상황 등 다양한 요소를 고려해야 하기 때문에 더 많은 CPU Instruction이 필요하며 Stack보다 할당속도가 느리다.
데이터 (Data)
전역변수, Static변수 등이 저장되는 영역.
할당된 데이터들은 프로그램이 실행되고 끝날때까지 메모리에 남아있다.
BSS영역과 Data영역으로 구분지어 말할 수 있다.
- BSS
- 초기화되지 않은 변수가 저장된다.
- 초기화된 데이터는 ROM의 Data 영역에 저장되는데, 아직 초기화되지 않은 데이터들 까지 ROM에 저장되면 큰사이즈의 ROM이 필요하기 때문에 BSS/DATA 영역을 나누어 저장한다.
- Data
- 초기화 된 변수가 저장된다.
- ROM에 위치하고 있지만 전역변수와 Static변수를 ROM에 저장하면 런타임시 변경된 값이 적용되지 않고 초기값만 가지게 되므로, RAM에 Data 영역을 복사하여 런타임시 변경되는 값을 저장할 수 있도록 한다.
- 따라서 프로그램 실행중 접근/수정/변경이 가능하다.
Text(Code)
- 실행할 코드 (기계어 형태)
- 사용자가 작성한 코드나 Read-Only변수가 저장되는 영역으로 컴파일 이후 기계어 형태로 저장된다.
- 프로그램 실행되고 끝날 떄까지 메모리에 남아있다.
- Read-Only이기 때문에 수정이 불가하다.
메모리 영역을 4가지로 나누는 이유는 우리가 어떠한 프로그램을 구현할 때 각각의 변수, 함수, 클래스 등이 호출되고 해제되는 시기가 다르기 때문이다. 만약 어떠한 함수 내에서 한번 사용되는 변수가 프로그램의 처음부터 끝까지 메모리에 남아있다면 메모리가 낭비되는 일이 되겠다.
메모리 관리를 해야하는 이유?
메모리 충돌을 방지 및 해결, 그리고 앱 성능을 효율적으로 관리할 수 있다.
문자열은 주로 가변적인 길이로 Heap 메모리에 저장된다.
구조체/클래스 라고 무조건 힙/스택 등 지정된 영역에서 동작하는 것은 아니다
(int, Double 등 대체적으로 stack 영역에 저장되지만 mutating이나 inout 키워드 사용시 Heap에 저장된다.)
반응형
'CS' 카테고리의 다른 글
[iOS] Design Pattern과 Architectures (0) | 2021.10.20 |
---|---|
ASCII, Unicode, UTF-8 문자표(CharacterSet)와 인코딩 (0) | 2021.09.14 |
Comments