[참고]
더보기
📝 컴퓨터 저장 공간의 계층 구조와 성능 특징
"레지스터 → CPU 캐시 메모리 → 메인 메모리 → 보조기억장치 → 외부기억장치" 순으로 CPU와 멀어진다.
CPU로부터 멀어질수록 데이터를 저장하는 용량이 커지고 접근 속도는 느려진다.
📝 1) 코드(Code) 영역
- 실행할 프로그램의 코드
- 컴파일 된 후 기계어 형태로 저장
- 컴퓨터에게 일을 시키는 실행 코드를 Instruction이라 함
- 텍스트 영역으로도 부름
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리
- 읽기 전용 (ROM)
📝 2) 데이터(Data) 영역
- 전역 변수, 정적 변수(static)가 저장됨
- 프로그램 실행 시, 전역 변수와 static 변수는 메인 함수가 호출되기 전에 데이터 영역에 할당
- 프로그램의 시작과 함께 할당, 프로그램 종료 시 소멸
- Read-Write 형태 (실행 도중 값 변경될 수 있음)
- 데이터 영역은 BSS 영역, Data 영역으로 나뉜다.
- BSS(Block Stated Symbol) 영역
- Data 영역
- 초기화가 이루어진 변수들이 저장
- 프로그램 실행 중 자유롭게 접근해서 수정, 변경이 가능
- 사실 데이터 영역은 ROM에 위치하는데, 전역변수와 static 변수를 ROM에 저장하면 런타임 시 변경된 값이 적용되지 않고, 계속 초기값만을 가지고 있게 된다. (ROM은 read only니까) 그래서 데이터 영역을 RAM에 복사해서 런타임 시 변경되는 값을 저장할 수 있도록 한다
- BSS와 Data 영역을 나누는 이유?
- 초기화된 데이터는 ROM의 data 영역에 저장된다. 하지만 아직 초기화되지 않은 데이터들까지 ROM에 저장되면 큰 사이즈의 ROM이 필요하기 때문에 이 영역을 나눔
📝 3) 힙 영역
- 객체의 참조값(Object Reference)이 저장됨 (Class와 그 Class객체들)
- class, closure와 같은 참조 타입의 데이터가 저장
- swift의 경우 ARC가 참조 타입의 할당, 해제 시점을 자동으로 관리
- Java의 경우 가비지 콜렉터(GC)가 관리
- C의 경우 사용자가 동적으로 할당, 해제 해줘야 함. (malloc, free)
- 런타임 시(프로그램이 실행되는 도중)에 힙 영역의 크기가 결정
- 동적 할당 및 해제
- 사용자가 직접 관리해야 하는 영역
- 메모리를 해제해주지 않으면 memory leak 발생 (동일 메모리 블록 중복 할당 방지 필요)
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
- 주로 긴 생명주기를 가지는 데이터들이 저장 (대부분의 객체는 크기가 크고 서로 다른 코드블럭에서 공유되는 경우가 많다.)
- 애플리케이션의 모든 메모리 중 stack에 있는 데이터를 제외한 부분이라고 보면 됨
- 모든 Object 타입(Integer, String, ArrayList, ...)의 참조값은 데이터 타입과 함께 heap 영역에 생성된다.
📝 4) 스택 영역
- 함수의 호출과 관계되는 지역 변수와 매개변수가 저장됨
- struct, enum과 같은 값 타입의 데이터가 저장
- 지역변수들은 scope에 따른 visibility를 가진다.
- Heap영역에 생성된 Object타입의 데이터 참조값이 할당
- 컴파일 시에 할당될 영역의 크기가 결정됨
- 원시 타입의 테이터가 값과 함께 할당 (Heap에는 할당되지 않음)
- 원시타입: byte, short, int, long, double, float, boolean, char
- 각 Thread는 자신만의 stack을 가진다.
- 함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸
- 푸시(Push)로 데이터 저장, 팝(Pop)으로 데이터 인출
- 가장 늦게 저장된 데이터가 가장 먼저 인출
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
- 지역변수들은 scope에 따른 visibility를 가진다.
📝 메모리 관리를 해야 하는 이유?
1) 앱 성능 효율적 관리
2) 메모리 충돌 방지 및 해결
- 문자열은 주로 가변 길이로 heap 메모리에 저장
- 구조체, 클래스라고 무조건 힙, 스택 등 지정된 영역에서 동작하는 것은 아님
(Int, Double 등 대체적으로 stack 영역에 저장되지만 아닌 경우도 있음) -> mutating, inout 키워드 사용 시
📝 iOS에서 메모리 관리하는 방법 - ARC
https://bokoo.tistory.com/entry/Swift-ARC-Automatic-Reference-Counting
'TIL (Today I Learned)' 카테고리의 다른 글
[CS] 객체지향 프로그래밍(OOP)이란? (0) | 2024.02.12 |
---|---|
[Swift] Swift란? (0) | 2024.02.12 |
[Swift] Class vs Struct (0) | 2024.02.10 |
[Swift] 메모리 관리 (1) | 2024.02.08 |
[SwiftUI] SwiftUI의 View란? (0) | 2024.01.30 |