본문 바로가기

Swift/Basic9

프로젝트가 프로세스가 되기까지 - 2 프로세스시작커널이 프로세스를 생성메모리 영역 할당빈 메모리 공간을 할당가상 메모리 공간 설정스택, 힙, 코드, 데이터 영역앱 실행 파일 로드dyld가 Mach-O 실행 파일을 로드하며 앱 시작dyldDynamic Link Editor의 약자macOS, iOS 운영 체제의 구성 요소앱을 사용할 수 있도록 준비  로딩 dyld가 수행하는 작업동적 프레임워크 로드시스템 프레임워크 및 종속 라이브러리(UIKit, Foundation, ...)을 메모리에 로드실행 파일, 라이브러리 내의 함수와 변수들의 심볼을 해결하고 연결참조할 수 있는 코드가 메모리에 로드symbol을 관리하고, 프로그램에서 사용할 수 있도록 담당iOS는 ASLR을 통해 메모리 배치가 매번 달라지며, 해당 주소 공간을 기준으로 포인터를 reba.. 2024. 12. 18.
프로젝트가 프로세스가 되기까지 - 1 프로젝트Xcode 빌드 시스템Xcode 빌드 시스템은 5개의 단계로 구성되어 있다.Preprocessor, 전처리기Compiler, 컴파일러Assembler, 어셈블러Linker, 링커Loader, 로더  Preprocessor, 전처리기전처리기의 목적은 컴파일러에 공급될 수 있는 방식으로 프로그램을 변환하는 것매크로를 정의로 대체종속성 발견전처리기 지시문 해결스위프트 컴파일러에는 전처리기가 없음대신 Xcode 빌드 시스템이 이를 보상(프로젝트 빌드 설정에서 전처리 조건 설정)  Compiler, 컴파일러컴파일러는 소스 프로그램을 다른 언어로 매핑하는 역할Swift 및 C family 언어를 기계어로 변환C family 언어: C/C++, Objective-C/C++Xcode는 두 개의 컴파일러를 사용S.. 2024. 12. 6.
Generic, Protocol Generic요구 사항에 따라 모든 타입에서 동작하는 유연하고, 재사용 가능한 함수 및 타입을 작성 가능제네릭이 해결하는 문제특정 타입에 의존하지 않고, 모든 타입에서 작동하는 범용적인 코드 작성 가능예를 들어, swapTwoInts라는 메소드는 Int라는 타입에 의존적임제네릭을 사용하면 타입 매개변수가 호출 시점에 지정한 타입으로 변환됨함수의 매개변수로 Int, String과 같은 타입이 아닌 타입 매개변수를 사용함타입 매개변수는 함수의 전달 값의 타입에서 추론됨프로토콜 정의프로토콜을 정의할 때 제네릭을 사용하고 싶다면 associatedtype 사용채택하는 측에선 typealias Protocol프로토콜은 타입특정작업 또는 기능에 적합한 메소드, 속성을 정의하는 방법클래스, 구조체, 열거형에 의해 .. 2024. 11. 7.
Data Type Class, Struct데이터를 캡슐화하기 위한 모델클래스와 구조체 공통점속성 정의(property), 기능 정의(method), 첨자 구문 정의(subscript), 초기화 구문 정의(init), 확장 가능(extension), 프로토콜관련 문서: Properties, Methods, Subscripts, Initialization, Extensions, Protocols클래스만 가진 기능상속 가능타입 캐스팅 사용으로 런타임에 클래스 인스턴스 타입 확인 및 해석deinit참조 카운팅으로 두 개 이상의 참조 허용관련 문서: Inheritance, Type Casting, Deinitialization, Automatic Reference Counting클래스와 구조체일반적으로 클래스가 지원하는 기능을 다.. 2024. 11. 7.
Concurrency Concurrency비동기 및 병렬 코드를 작성하기 위한 방법GCD & Completion HandlerAsync & Await Async & Await 등장 이전Completion Handler의 중첩으로 Callback Hell 발생Callback: 작업이 완료된 후 실행되는 함수 또는 클로저비동기 작업 결과 처리 혹은 특정 작업 후 추가 동작을 위해 사용Completion Handler: 비동기 함수에서 특정 작업이 완료된 후에 실행할 콜백 함수 또는 클로저함수는 작업을 시작한 후 반환 되지만, 클로저는 함수가 반환된 후 호출되기 때문에 클로저를 나중에 호출하기 위해 @escaping 어노테이션을 채택Callback Hell 문제점중첩된 들여 쓰기로 인해 가독성 저하코드의 흐름이 직관적이지 않음휴먼.. 2024. 11. 7.
GCD GCD, Grand Central Dispatch병렬 코드 실행을 단순화하는 동시성 프로그래밍을 위한 프레임워크공유된 스레드 풀을 관리하는 주체스레드 관리의 복잡성을 추상화하여 수행할 작업에 집중새로운 스레드를 생성하는 경우sync는 스레드 재사용, async는 스레드 생성 Dispatch Queue스레드를 다루는 GCD의 구성 요소보통 Dispatch Queue를 통해 작업을 지시하고, 컴플리션 핸들러를 통해 작업 완료를 알림Thread safe하게 스레드들을 관리할 수 있는 도구멀티 스레드에서 어떤 함수, 변수, 객체에 여러 스레드가 동시에 접근해도 문제가 발생하지 않음Re-entrancy: 하나의 일에 대해 부분적으로 실행Mutual exclusion, Mutex: 공유된 데이터에 대해서 오직 하나.. 2024. 10. 31.
Memory Management Automatic Reference CountingSwift의 메모리 사용량을 추적하고 관리하는 기법인스턴스가 필요하지 않을 때, 클래스 인스턴스가 사용하는 메모리를 자동으로 해제클래스의 인스턴스에만 적용구조체와 열거형은 값 타입으로 참조로 저장 및 전달되지 않음작동 방식클래스의 인스턴스를 생성할 때, ARC는 메모리를 할당인스턴스와 관련된 저장 프로퍼티의 값, 인스턴스 타입에 대한 정보 저장인스턴스가 더 이상 필요하지 않을 때, ARC는 메모리를 비움인스턴스가 필요한지 확인하기 위해 클래스 인스턴스를 속성, 상수, 변수에 할당할 때마다 인스턴스에 대한 strong 참조를 만듦weak 참조참조 횟수를 증가시키지 않음참조되는 인스턴스가 참조하는 인스턴스보다 수명이 짧은 경우 사용오버헤드 발생weak 하게 .. 2024. 10. 31.
Memory 앱 실행 시 Virtual MemorySwift 앱이 시작될 때, 가상 메모리의 빈 주소 공간을 할당받음메인 실행 파일, 라이브러리, 프레임워크를 로드디스크로부터 읽기 전용 리소스 로드실행 후각 스레드의 로컬, 임시 변수에 대해 스택을 사용동적 메모리, 수명이 긴 메모리는 힙 사용 Heap Memory힙은 여러 가상 메모리 영역으로 구성각 영역은 개별 힙 할당으로 분할할당 내부는 16KB 메모리 페이지로 더 크거나 작을 수 있음메모리 페이지는 3개의 상태: Clean, Dirty, Swapped(Compressed)Clean page쓰기가 완료되지 않은 메모리할당되었지만 사용되지 않았거나, 읽기 전용 파일을 나타내는 페이지Dirty page앱에 의해 최근에 쓰인(수정된) 페이지Swapped(Compres.. 2024. 10. 31.
Thread Process운영체제에서 실행되는 프로그램의 인스턴스각 프로세스는 자체 메모리 공간을 갖고, 다른 프로세스와 메모리를 공유하지 않음독립적으로 실행되며, 프로세스 간 통신은 시스템 자원(파이프, 소켓 등)을 통함 Context SwitchingCPU가 새로운 프로세스를 수행하기 위해 기존의 프로세스를 교체하는 작업 Thread프로세스가 만들어내는 작업자프로세스와 메모리 Data 영역을 공유하고, 개별 Stack, Text 영역을 가짐사용 이유: 컨텍스트 스위칭보다 적은 비용으로 여러 개의 작업을 처리 가능 Thread Programming자원을 효율적으로 사용하고, 좋은 성능을 만들기 위해 스레드 필요무거운 작업을 진행하며, 동시에 다른 스레드에서 다른 작업을 처리할 수 있음스레드 전환 비용이 프로세스의 .. 2024. 10. 31.