본문 바로가기
Swift/Basic

프로젝트가 프로세스가 되기까지 - 2

by songmoro 2024. 12. 18.
728x90

프로세스

시작

  • 커널이 프로세스를 생성
  • 메모리 영역 할당
    • 빈 메모리 공간을 할당
    • 가상 메모리 공간 설정
      • 스택, 힙, 코드, 데이터 영역
    • 앱 실행 파일 로드
  • dyld가 Mach-O 실행 파일을 로드하며 앱 시작
    • dyld
      • Dynamic Link Editor의 약자
      • macOS, iOS 운영 체제의 구성 요소
      • 앱을 사용할 수 있도록 준비

 

 

로딩

 

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