Neoself의 기술 블로그

iOS CS 정리(241219) 본문

개발지식 정리/CS정리

iOS CS 정리(241219)

Neoself 2024. 12. 12. 14:52

컴퓨터 시스템의 구성요소

CPU

컴퓨터의 두뇌 역할을 하는 중앙처리장치로, 실제 연산과 명령어 처리를 담당합니다. 산술논리연산장치(ALU)와 제어장치(CU)로 구성되어 있습니다.

 

RAM

주기억장치로, CPU가 직접 접근할 수 있는 고속의 휘발성 메모리입니다. 실행 중인 프로그램과 데이터를 임시로 저장합니다.

 

저장장치

HDD나 SSD와 같은 비휘발성 메모리로, 전원이 꺼져도 데이터가 유지됩니다.

 

CPU와 메모리 간의 데이터 교환은 버스 시스템을 통해 이루어집니다. 여기서 버스는 전기적 신호를 전달하는 물리적 와이어들의 집합이라고 이해하면 쉽습니다. 버스는 아래와 같은 유형으로 나뉩니다.

  • 데이터 버스: 양방향 통신을 지원하며, CPU 및 다른 장치들 사이의 실제 데이터를 전송합니다.
  • 주소 버스(Address Bus): CPU -> 다른 장치로 가는 단방향 통신을 지원하며, 메모리나 I/O 장치의 특정 주소를 지정할때 사용됩니다. 예를 들어 CPU가 메모리의 특정 데이터를 읽으려 할때에는, 참조하고자 하는 메모리 주소를 주소 버스를 통해 메모리로 전송, 지정된 주소의 데이터를 메모리가 데이터 버스를 통해 CPU로 반환하는 과정을 거치며, 반대로 데이터를 쓰고자 할때에는 주소버스를 먼저 전송한후, 다시 CPU가 대상 장치에 데이터버스를 사용해 데이터를 전송하는 과정을 거칩니다. 하지만, 읽기와 쓰기 둘다 메모리의 주소를 전송하는 주소 버스를 사용한다는 점에서, 대상 장치에서는 어떤 동작을 수행해야하는지 알수가 없습니다. 이때 제어버스가 필요하게 됩니다.
  • 제어 버스(Control Bus): 참조하고자 하는 주소, 데이터를 통해 어떤 작업을 할 계획인지 전달하는 데에 사용되는 버스입니다. 이러한 제어 동작은 CPU 뿐 아니라, 인터럽트와 같은 다른 장치에서도 통신이 시작될 수 있는 것이기 때문에, 양방향 통신을 지원합니다.

캐시 메모리의 개념과 역할

캐시 메모리는 CPU와 주기억장치(RAM) 사이의 속도 차이를 줄이기 위한 고속의 버퍼 메모리입니다.

캐시의 효율성을 높이는 핵심 개념으로, 두 가지 유형의 지역성 원리가 있습니다

  • 시간적 지역성: 최근 접근한 데이터는 곧 다시 접근될 가능성이 높다는 원리
  • 공간적 지역성: 특정 데이터 주변의 데이터도 곧 접근될 가능성이 높다는 원리

CPU 아키텍처

ARM 아키텍처:

  • RISC(Reduced Instruction Set Computing:감소된 명령어 집합 컴퓨팅)을 기반. 
  • 모두 32비트 혹은 64비트와 같이 일정한 길이로 명령어가 구성됨
  • 각 명령어는 기본 산술연산, 메모리 접근, 분기 명령과 같은 작은 범위를 처리
  • 전력 효율성 높고, 모바일 기기에 주로 사용

x86 아키텍처:

  • x86 아키텍처는 CISC(Complex Instruction Set Computing: 복잡한 명령어 집합 컴퓨팅) 기반.
  • 메모리 주소 계산, 메모리 접근, 산술 연산 그리고 결과 저장까지 한 명령어로 넓은 범위의 동작 수행 가능
  • 한 사이클에 실행완료되는 ARM에 비해, x86은 명령어에 따라 여러 사이클 소요될 수 있음. 
  • 데스크톱, 서버와 같은 고성능 컴퓨팅 분야에 주로 사용

iOS AP와 SoC

Application Processor (AP)

  • 모바일 기기의 '두뇌' 역할을 하는 핵심 프로세서.
  • 애플이 직접 설계한 A,M시리즈 칩이 AP로 사용됨.
  1. 배터리 사용기기에 최적화되어있는 저전력 설계가 적용되어있음.
  2. CPU 코어 뿐만 아니라 Graphics Processing Unit, Neural Processing Unit과 같은 부가 유닛들의 기능도 통합되어있음.
  3. 터치스크린 인터페이스를 지원하고, 모바일 그래픽을 가속할 수 있는 등 모바일환경에 최적화되어있음.

SoC(System on a Chip)

SoC는 하나의 칩에 컴퓨터나 전자기기에 필요한 대부분의 구성요소를 통합한 집적회로입니다.

여기서 AP는 SoC의 한 형태로 볼 수 있으며, 이로 공간 효율성 및 전력 효율성 극대화

구성 요소: CPU, GPU, Neural Engine, 메모리 컨트롤러, 무선 통신 모듈, 기타 주변장치 컨트롤러


운영체제와 iOS 구조

iOS, MacOS와 같이 컴퓨팅 기기를 효율적으로 사용할 수있게 해주는 핵심 소프트웨어

XNU라는 커널 기반 설계

XNU 커널 위로 아래 계층들 존재

  1. Cocoa Touch 계층: 최상위 계층으로 사용자 인터페이스와 직접적인 상호작용 담당, 기본 앱 인프라 제공,
    ex. UIKit, 터치 처리, 푸시 알림 등
  2. Media 계층: 그래픽, 오디오, 비디오 처리 담당
    ex. Core Graphics, Core Audio, Metal 등
  3. Core Services 계층: 기본적인 시스템 서비스들
    ex. Foundation Framework, 네트워킹, 데이터 관리, 파일 시스템 접근 등
  4. Core OS 계층: 저수준의 기능들 + XNU커널
    ex. 보안, 인증서, 하드웨어 통신 담당

*상위 계층은 하위 계층의 서비스를 사용

*계층이 더 낮을 수록 더 기본적이고 필수적인 서비스를 제공하며, 계층이 높을수록 더 추상화되고 사용하기 쉬운 인터페이스를 제공


샌드박스

  • iOS의 샌드박스는 각각의 앱이 독립된 공간에서 실행되는 구조
  • 사용자의 갤러리,연락처와 같은 데이터와 Bluetooth, Wi-fi와 같은 시스템 리소스의 접근이 제한
  • Info.plist에 권한 설명을 추가해, 사용자로부터 명시적인 권한을 획득하는 과정 필요
  • 이는 보안과 안정성을 위한 것으로, 악성 앱이 다른 앱의 데이터를 탈취하는 것을 방지

커널

  • 운영체제의 '두뇌'.
  • CPU, 메모리, 저장장치 등의 하드웨어 자원을 관리
  • 앱들이 이러한 자원을 사용할 수 있게 프로세스 스케줄링

예시

  • 사진 앱에서 사진을 찍으면, 커널이 카메라 하드웨어를 제어하고 촬영된 데이터를 메모리에 저장
  • 음악을 들을 때 커널이 오디오 하드웨어를 제어
  • 앱 실행 시, 커널이 필요한 메모리를 할당하고 관리

다중 태스킹(Multitasking) by OS

배터리 수명, 성능 고려해 제한적으로 여러 앱을 동시에 사용할 수 있게 해주는 기능. 

프로세스 관리: 각 프로세스에 고유한 프로세스 ID 할당하고 관리, 프로세스별로 독립된 메모리공간을 할당해 서로 간섭하지 않도록 함

CPU 스케줄링: 라운드 로빈, 우선순위 기반 등 다양한 스케줄링 알고리즘을 사용해 여러 프로세스들이 CPU 번갈아 사용하도록 시간분배

메모리 관리: 가상메모리를 통해 프로세스별 독립 메모리 공간 제공 / 페이징과 세그멘테이션으로 물리 메모리 효율관리

컨텍스트 스위칭: 프로세스 전환 시 현재 프로세스의 상태 저장, 다음 실행할 프로세스의 상태 복원하여 실행 지속


프로세스와 스레드

프로세스: 독립된 실행 단위, 독립된 메모리 공간

스레드: 프로세스 내부의 실행 흐름, 메모리 공유

*프로세스는 식당, 스레드는 그 식당에서 일하는 요리사. 프로세스가 지닌 메모리와 자원 공유하면서 각자 다른 작업 수행

프로세스
├── 메모리 영역
│   ├── Code Section (공유)
│   ├── Data Section (공유)
│   └── Heap (공유)
│
├── 스레드 1
│   └── Stack (독립)
├── 스레드 2
│   └── Stack (독립)
└── 스레드 3
    └── Stack (독립)

 

 

각 스레드는 아래 요소로 구성되며, 프로세스 단의 코드 영역, 데이터 영역, Heap(동적 메모리 할당)영역을 공유받음.

  • 다음 명령어의 위치 명시하는 Program Counter
  • 스레드의 현재 작업 상태 나타내는 Register Set
  • 스레드 고유의 작업공간인 Stack

멀티 스레딩

리소스 효율적으로 사용하기 위해 하나의 프로세스 내에 여러 스레드가 동시(병렬처리로)에 실행되는 것.

ex. UI처리와 백그라운드 작업 분리해 UI Freezing 해결

동시성 프로그래밍에 해당되나, Task를 단위로 하지 않고 스레드를 단위로 함.

자원공유가 추상화된 동시성 프로그래밍에 비해, 각 스레드는 프로세스의 리소스를 공유하면서 독립적으로 실행


GCD(Grand Central Dispatch)

  • 동시성 프로그래밍을 위한 Apple의 프레임워크
  • DispatchQueue를 기반, 복잡한 스레드 관리를 추상화해 개발자가 '무슨 작업을 할지'에만 집중할 수 있게 해줌

시스템 수준에서 스레드 풀 관리하기에, 직접 스레드 생성하고 관리하는 로직 자동으로 처리

작업 큐 기반 동시성 지원

작업을 큐(Queue)에 넣으면 시스템이 알아서 적절한 스레드에서 실행해주는 방식. 크게 아래 유형의 큐를 제공

Serial Queue: 한 번에 하나의 작업만 실행하며, 작업들이 추가된 순서대로 순차적으로 실행

Concurrent Queue: 동시에 여러 작업을 실행할 수 있으며, 시스템이 허용하는 만큼의 병렬 처리가 가능

class ImageLoader {
    let queue = DispatchQueue(label: "com.example.imageloader", attributes: .concurrent)
    
    func loadImage(url: URL, completion: @escaping (UIImage?) -> Void) {
        queue.async {
            // 이미지 다운로드 작업
            let data = try? Data(contentsOf: url)
            let image = data.flatMap { UIImage(data: $0) }
            
            DispatchQueue.main.async {
                completion(image) // UI 업데이트는 메인 큐에서
            }
        }
    }
}

ARC

iOS에서 주로 사용되는 핵심 메모리 관리 방식

  • 컴파일 시점에 메모리 관리 코드(retain/release)가 자동으로 삽입해, 런타임에서의 오버헤드 최소화
  • 개발자의 수동 메모리 관리 불필요하지만, 순환 참조 수동 관리 필요
  • Reference Counting 방식으로 동작
    (ex. var person: Person? = Person(name:”John”)) 코드에서 참조카운트가 1 증가
  • strong, weak, unowned 참조를 통한 순환 참조를 방지
  • 실시간으로 메모리가 해제되며, CPU 부하가 적음.

Garbage Collection

  • 런타임에 주기적으로 동작
  • 순환 참조를 자동으로 감지하고 처리하며 개발자가 메모리 관리를 신경 쓸 필요가 적음
  • Mark and Sweep 알고리즘을 사용하며, Mark로 사용중인 객체를 표시, Sweep으로 표시되지 않은 객체를 제거
  • CPU, 메모리 사용량이 더 많으며, 실행 시 앱이 일시정지됨
  • 메모리 해제 시점을 예측하기 어려움.

앱 간 데이터 공유 방법

URL 스킴

웹사이트 주소처럼 각 앱은 자신만의 고유한 주소체계를 가짐.

같은 기기 내에 동일한 URL 스킴을 가진 여러 앱이 존재할 수 있기에, appDelegate에서는 URL 스킴으로 접근하려는 앱이 자신의 앱인지 검증하는 과정이 필요하며, 아닐 경우 같은 스키마의 다른 앱으로 처리 권한을 넘기는 로직을 구현해야함.

 

앱 그룹

같은 개발자의 여러 앱들이 공유할 수 있는 공유 컨테이너.

이는 iOS의 샌드박스 보안 모델 내에서 제한적인 데이터 공유를 가능케함.

아래와 같은 데이터 공유 가능

  • UserDefaults: 간단한 키-값 쌍의 데이터를 저장하고 공유할 수 있습니다.
  • Keychain: 비밀번호나 인증 토큰과 같은 민감한 데이터를 안전하게 공유할 수 있습니다
  • SQLite 데이터베이스(Core data 프레임워크)

File System

파일 앱을 통한 수동적 공유도 있지만, 앱 그룹을 통한 프로그래밍 방식의 자동화된 공유도 가능

let groupID = "group.com.company.appgroup" // 앱 그룹 내 공유 디렉토리
if let containerURL = FileManager.default.containerURL(
    forSecurityApplicationGroupIdentifier: groupID) {
    // 공유 파일 저장/읽기
    let sharedFileURL = containerURL.appendingPathComponent("shared.txt")
}

샌드박스 모델 기반, 독립된 FS 공간 보유함.

  • Documents 디렉토리: 사용자 데이터 파일 저장하며, 앱 종료되어도 데이터 유지(이미지, 비디오, 문서 파일 등의 단순한 파일 기반 바이너리 데이터)
  • Library 디렉토리: Caches(임시 데이터 저장), Preferences(앱의 설정 데이터), 앱 종료되어도 데이터 유지되나, 시스템에 의해 삭제될 수 있음
  • tmp 디렉토리: 임시 파일을 저장하는 공간, 앱이 실행중일때만 사용, → 앱 종료 시 시스템이 자동으로 비움

iOS에서의 메모리 구조

  • Stack: 함수 호출 스택, 지역변수
  • Heap: 동적 할당 메모리
  • Data: 전역변수, 정적 변수
  • Text: 실행코드

 


iOS에서의 메모리 관리 방식

- ARC(Automatic Reference Counting)

- NSCache 사용하여 메모리 사용 최적화

- viewWillDisappear 메서드를 사용해 ViewController 생명주기에 맞춰 메모리 누수 방지


iOS에서의 보안 통신 방법

 

  • ATS(App Transport Security)
  • SSL/TLS 인증서 피닝
  • 데이터 암호화
  • 토큰 기반 인증
  • WKWebView 사용 시, CORS 정책 적용

CORS: 웹 브라우저의 보안 정책으로서, 한 출처(Origin)에서 다른 출처의 리소스에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다. 여기서 Origin은 프로토콜+도메인+포트

CORS에 의해 프론트엔드 URL과 백엔드 URL이 다른 상황에서, 백엔드 API 호출을 시도할 경우, 기본적으로 차단됨.

CORS는 HTTP와 HTTPS 모두에서 동작

웹 브라우저의 보안정책이기에 네이티브 앱 개발환경에서는 CORS가 적용되지 않지만, 웹뷰 구현 시에는 CORS 정책이 적용됨

let webView = WKWebView(frame: view.bounds)
webView.load(URLRequest(url: URL(string: "<https://example.com>")!))

'개발지식 정리 > CS정리' 카테고리의 다른 글

CS 정리 (10월 30일)  (0) 2024.10.30
CS 정리 (10월 22일)  (0) 2024.10.22