iOS/Common

iOS 운영체제: 프로세스, 스레드, 메모리 관리, 샌드박스 이해하기

TDCIAN 2024. 3. 27. 00:21

 

1. 프로세스와 스레드의 차이점

iOS에서 실행되는 앱은 프로세스와 스레드라는 두 가지 주요 실행 단위를 가지고 있습니다. 프로세스는 실행 중인 프로그램의 인스턴스로, 각각 독립적인 메모리 공간을 가지고 있습니다. 반면, 스레드는 프로세스 내에서 실행되는 흐름의 단위로, 프로세스 내의 메모리 공간을 공유하며 실행됩니다.

 

iOS에서의 프로세스와 스레드 관리

iOS에서는 GCD(Grand Central Dispatch)와 NSOperationQueue를 사용하여 스레드를 관리합니다. 이를 통해 개발자는 복잡한 스레드 관리를 피하고, 메모리 사용량을 최적화할 수 있습니다.

 

GCD를 사용한 스레드 관리 예시

// GCD를 사용하여 백그라운드 스레드에서 작업 수행
DispatchQueue.global(qos: .background).async {
	// 백그라운드 스레드에서 작업 수행
    print("백그라운드 스레드에서 실행 중")
    
    // 메인 스레드로 전환하여 UI 업데이트
    DispatchQueue.main.async {
    	// 메인 스레드에서 UI 업데이트
        print("메인 스레드로 돌아왔습니다.")
    }
}

 

 

2. 메모리 관리 기법

iOS에서는 ARC(Automatic Reference Counting)와 Memory Management를 사용하여 메모리를 관리합니다. ARC는 객체의 참조 카운트를 자동으로 관리하여, 클래스 인스턴스가 더 이상 필요하지 않을 때 사용되지 않는 메모리를 자동으로 해제하고, 메모리 누수를 방지합니다. 

ARC는 객체의 참조 수를 추적하고 관리하여 작동합니다. 객체가 생성될 때 참조 수는 1로 설정됩니다. 다른 객체가 해당 객체에 대한 참조를 가지면 참조 수가 증가합니다. 객체의 참조 수가 0에 도달하면 자동으로 메모리에서 해제됩니다.

iOS 애플리케이션에서 ARC를 구현하기 위해 개발자는 객체에 대한 참조를 선언할 때 'strong'과 'weak' 키워드를 사용해야 합니다. 'strong' 참조는 객체가 최소한 하나의 'strong' 참조가 있는 한 계속 존재함을 의미하며, 'weak' 참조는 객체가 존재하지 않을 수 있음을 의미합니다.

 

예시 코드

class MyClass {
	var myObject: MyObject? // 강한 참조
    weak var myWeakObject: MyObject? // 약한 참조
}

let myObject = MyObject()
let myClass = MyClass()

myClass.myObject = myObject // 강한 참조, 참조 수를 1로 증가시킵니다.
myClass.myWeakObject = myObject // 약한 참조, 참조 수를 증가시키지 않습니다.

 

ARC는 객체 간의 참조를 추적하기 위해 '객체 그래프'라는 기술을 사용합니다. 객체에 더 이상 강한 참조가 없을 때, 객체는 할당 해제를 위해 마킹되며, 그 객체에 약한 참조가 있는 모든 객체의 참조는 nil로 설정됩니다.

또한, ARC는 컴파일 시간에 기존 MRC(Manual Reference Counting)에서 개발자가 직접 코드를 작성해야 했던 부분을 자동으로 구문을 분석하여 적절하게 참조 감소 코드를 삽입해주어, 실행 중에 별도의 메모리 관리가 이루어지지 않도록 합니다.

 

 

3. 샌드박스(Sandbox) 개념과 역할

이미지에 원문 링크 걸려 있습니다.

 

iOS의 샌드박스는 앱이 실행되는 안전한 환경을 제공하는 기술입니다. 샌드박스는 외부로부터 들어온 프로그램이 보호된 영역에서 동작하도록 하여, 시스템이 부정하게 조작되는 것을 막는 보안 형태입니다. 이는 커널 수준에서 강제 적용되는 맥 OS의 접근제어 기술입니다. 앱이 손상될 경우 시스템과 사용자 데이터의 손상을 억제하도록 설계 되어 있으며, 앱스토어에 유통되는 모든 앱들은 앱 샌드박스를 적용시켜야만 합니다. 애플 개발자 계정으로 앱 스토어가 아닌 다른 곳에서 유통된 앱 또한 앱 샌드박스를 적용시켜야 합니다.

 

샌드박스는 무적이 아니며 앱은 언제나 손상될 위험에 놓여있지만, 앱이 업무를 수행하는데 필요한 최소한의 권한으로 권한을 제한할 경우 잠재적 피해의 범위는 줄어들 수 있다는 특징이 있습니다. 사용자는 앱을 사용하면서 많이 보던 얼럿창을 통해 앱에 추가 접근 권한을 부여할 수 있습니다. 이러한 방식으로 사용자는 앱에게 투명하게 추가 액세스 권한을 부여할 수 있습니다.

 

앱 간 데이터 공유 방법

앱 간 데이터 공유는 App GroupsKeychain을 통해 가능합니다. App Groups는 같은 개발자가 개발한 앱들 간에 데이터를 공유할 수 있게 해주는 기능입니다. Keychain은 암호화된 데이터를 안전하게 저장하고 관리할 수 있는 기능으로, 앱 간에 비밀번호, 토큰 등의 민감한 정보를 공유할 때 사용됩니다.

 

App Groups

App Groups를 사용하면 같은 개발자가 개발한 여러 앱 간에 데이터를 공유할 수 있습니다. 이는 사용자 데이터나 설정을 여러 앱 간에 공유해야 하는 경우에 특히 유용합니다. App Groups를 사용하기 위해 개발자는 다음을 수행해야 합니다.

 

1. Xcode 내 Project Settings의 Capabilities 섹션에서 App Groups를 활성화합니다.

2. 그룹에 대한 고유한 App Group 식별자를 지정합니다.

3. 코드에서 공유 데이터에 접근할 때 공유 App Group 식별자를 사용합니다.

 

Keychain

Keychain은 민감한 정보를 안전하게 저장하는 데 사용되는 보안 저장소입니다. 기본적으로 한 앱에서 저장된 데이터는 다른 앱에서 읽을 수 없습니다. 그러나 개발자는 Keychain Groups를 사용하여 여러 앱 간에 Keychain 항목을 공유할 수 있습니다. Keychain 항목을 공유하기 위해 개발자는 다음을 수행해야 합니다.

 

1. Xcode 내 Project Settings의 Capabilities 섹션에서 Keychain Sharing을 활성화합니다.

2. Keychain Sharing 설정에서 Keychain Group 이름을 지정합니다. 이 이름은 일반적으로 App ID Prefix와 사용자 지정 이름의 조합입니다. (예시: myKeychainGroup1)

3. Keychain 항목을 추가, 찾거나 삭제할 때 kSecAttrAccessGroup 키를 사용하여 Keychain Group을 지정합니다. 이렇게 하면 동일한 Keychain Group을 가진 앱만 공유 항목에 접근할 수 있습니다.

 

예시: 특정 접근 그룹으로 Keychain에 항목을 추가하는 코드

let query: [String: Any] = [
	kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "accountName",
    kSecValueData as String: "password".data(using: .utf8)!,
    kSecAttrAccessGroup as String: "myKeychainGroup1"]
]

let status = SecItemAdd(query as CFDictionary, nil)

 

예시: Keychain에서 항목을 검색하는 코드

let query: [String: Any] = [
	kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "accountName",
    kSecReturnData as String: kCFBooleanTrue!,
    kSecMatchLimit as String: kSecMatchLimitOne,
    kSecAttrAccessGroup as String: "myKeychainGroup1"
]

var dataTypeRef: AnyObject?
let status: OSStatus = SecItemCopyMatching(query as CFDctionary, &dataTypeRef)

 

Keychain 공유는 안전합니다. 동일한 개발자가 서명한 앱만 Keychain 항목을 공유할 수 있습니다.

이는 코드 서명, 권한 설정 프로파일, Apple Developer Program을 통해 강제로 적용됩니다.

 

 

내용 출처: phind