728x90
프로세스
시작
- 커널이 프로세스를 생성
- 메모리 영역 할당
- 빈 메모리 공간을 할당
- 가상 메모리 공간 설정
- 스택, 힙, 코드, 데이터 영역
- 앱 실행 파일 로드
- dyld가 Mach-O 실행 파일을 로드하며 앱 시작
- dyld
- Dynamic Link Editor의 약자
- macOS, iOS 운영 체제의 구성 요소
- 앱을 사용할 수 있도록 준비
- dyld
로딩
dyld가 수행하는 작업
- 동적 프레임워크 로드
- 시스템 프레임워크 및 종속 라이브러리(UIKit, Foundation, ...)을 메모리에 로드
- 실행 파일, 라이브러리 내의 함수와 변수들의 심볼을 해결하고 연결
- 참조할 수 있는 코드가 메모리에 로드
- symbol을 관리하고, 프로그램에서 사용할 수 있도록 담당
- iOS는 ASLR을 통해 메모리 배치가 매번 달라지며, 해당 주소 공간을 기준으로 포인터를 rebase
ASLR
- 주소 공간 레이아웃 무작위화(address space layout randomization)
- 메모리에서 특정 기능의 위치를 예측하지 못하게 하기 위한 보안 기능
- 앱이 시작될 때 마다 메모리의 다른 위치에 배치됨
- dyld는 고유 시작 위치를 고려해 포인터를 다시 설정함(= rebase)
- 앱 시작 시간 증가
실행 중
동적, 수명이 긴 메모리는 힙에 할당
- malloc, calloc과 같은 할당 프리미티브로 생성됨
- 직접 호출하지 않음
- 컴파일러와 런타임이 클래스 인스턴스를 생성할 때 주로 사용
- Swift는 클래스 이니셜라이저를 확장해 일련의 Swift 런타임 함수를 호출하고, 함수는 결국 malloc을 호출
class ExampleClass { }
let exampleInstance = ExampleClass()
// 1. ExampleClass()
// 2. ExampleClass.__allocating_init()
// 3. swift_allocObject()
// 4. swift_slowAlloc()
// 5. malloc()
각 스레드의 로컬 및 임시 변수는 스택을 사용
- 함수가 호출될 때 과정
- Call Stack에 새로운 Call Frame을 할당
- Context 저장을 위해 현재 상태를 Call Frame에 저장됨
- Call Frame에 매개변수 전달
- 로컬 상태 관리를 위해 Call Frame을 사용해 함수 코드 실행
- 함수 완료 후 저장된 Context를 복원 및 Call Frame Pop
Call Frame
- Stack Frame으로 알려짐
- 상태: 지역 변수, 매개변수, 함수 반환 주소, 저장된 레지스터 값
// updateAll -> CallFrame
func updateAll(models: [any DataModel],
from source: DataSource) {
for model in models {
model.update(from: source)
}
}
struct CallFrame {
Array<AnyDataModel> models;
DataSource source;
AnyDataModel model;
ArrayIterator iterator;
...
void *savedX29;
void *savedX30;
};
참고
https://developer.apple.com/videos/play/wwdc2024/10173
https://www.emergetools.com/blog/posts/SwiftReferenceTypes
https://www.emergetools.com/glossary/dyld
https://developer.apple.com/videos/play/wwdc2024/10217
https://developer.apple.com/videos/play/wwdc2019/423
https://xiangyu-sun.medium.com/understanding-swift-call-frames-and-dynamic-sizing-of-memory-layout-0c97bafbb773
728x90
'Swift > Basic' 카테고리의 다른 글
프로젝트가 프로세스가 되기까지 - 1 (1) | 2024.12.06 |
---|---|
Generic, Protocol (2) | 2024.11.07 |
Data Type (0) | 2024.11.07 |
Concurrency (0) | 2024.11.07 |
GCD (0) | 2024.10.31 |