TeamCoook / iOSInterviewQuestions

✅ iOS 개발자 기술 면접 대비
18 stars 0 forks source link

[레벨 0] `1주차` 2. 운영체제의 역할과 iOS에서의 운영체제 구조에 대해 설명해주세요. #2

Open longlivedrgn opened 5 months ago

longlivedrgn commented 5 months ago

4/16 23:59

longlivedrgn commented 5 months ago
운영체제의 역할과 iOS에서의 운영체제 구조에 대해 설명해주세요.
### OS 운영체제의 역할는 크게 두 개로 나눌 수 있다. - Abstraction - 프로그램(애플리케이션)이 I/O device등 resource를 활용할 수 있도록 API를 제공해주는 것. - 쉽게 말해서 컴퓨터 시스템 hardware abstraction을 제공해준다. - CPU/Process - Memory - Storage - I/O device - Network - Protection과 Isolation - 만약 위의 컴퓨터 시스템 hardware를 프로그램마다 자기 마음대로 접근할 경우, 개발자가 이상한 코드를 심어둘 수 있고 그럴 경우, 전체 시스템 자체에 큰 문제가 생길 수 있다. - 그래서 운영체제는 application의 특정 행동들을 dual mode로서 정의하고 무분별한 자원 접근에대해서 검열을 한다. - user mode → kernel mode로 가고 싶을 경우, syscall을 통해서 자신이 원하는 자원에 접근을 한다. - 그리고 해당 protection의 하나의 유닛이 process이다. - Isolation - 하나의 프로그램이 에러가 났다고해서 다른 프로그램도 에러가 생기는 것을 방지하는 것. - 완전 서로 독립된 process ### iOS - iOS는 크게 4개의 계층으로 되어있다. - Cocoa/Cocoa Touch 프레임워크 - Media Layer - ex) AVFoundation - Core Services - Core OS - 앱은 아이폰 디바이스에 바로 접근하는 것이 아니라 OS(iOS)를 통해서 접근을 한다. - 이 또한, OS의 존재의 의미와 맞닿아있다. → sandbox의 존재와도 - Cocoa and Cocoa Touch are the application development environments for OS X and iOS, respectively. Both Cocoa and Cocoa Touch include the Objective-C runtime and two core frameworks: - 우리가 자주 듣는 Cocoa/Cocoa Touch는 OS X와 iOS 운영체제에서 앱을 만들기위한 환경을 의미한다. - 각각은 Objc 런타임을 기반으로 한다. `Cocoa Touch` - UIKit, Foundation, Core Data, Mapkit등을 포함하고 있는 Framework이다. - iOS, iPadOS 등 애플 기기에서 구동되는 Application을 개발하기 위해 사용되는 통합 프레임워크 `Cocoa Framework` - MacOS를 개발할 때 활용되는 Framework이다. - UIKit이 아니라 AppKit을 포함하고 있다.
프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요.
`프로세스` - 실행 중인 프로그램 `스레드` - **프로세스를 구성하는 실행의 흐름 단위** - 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 쉽게 말해서 프로세스 안에 스레드가 있다. **그렇다면 멀티 프로세스와 멀티 스레드의 차이점은? → 둘 다, 하나의 애플리케이션을 구동할 때를 가정해서 생각해야된다. 하나의 애플리케이션을 구동시키기 위해서 여러 프로세스를 여는 것 vs 여러 스레드를 여는 것의 차이다.** ### iOS에서의 프로세스 관리 - 프로세스의 메모리 관리 - ARC를 활용한다. - paging과 segmentation를 통한 Virtual Memory를 활용를 활용한다. - 프로세스 스케쥴링 - 멀티 태스킹을 지원하고 - QoS등을 활용하여 앱의 중요도에 따라서 CPU, 메모리 등의 자원을 할당한다. - 보안 - 샌드박스 - 앱 권한 설정 ### iOS의 스레드 관리 - GCD - Swift Concurrency - OperationQueue - DispatchQueue
메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요.
- ARC는 자세하게 다른 issue에서 다룰 예정이여서 간단하게만 작성 ### ARC - Automatic Reference Counting - 객체의 참조 횟수를 추적하여 메모리를 자동으로 관리하는 시스템이다. - 컴파일 타임에 자동으로 retain, release를 적절한 위치에 삽입하는 방식으로 기존의 메모리 방식(MRC)를 쉽게 바꾸었다. - 그리고 삽입된 retain, release 코드는 런타임에 실행되어 reference count를 증감시킨다. 그리고 0이되면 deinit을 시킨다.
iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요.
- iOS의 샌드박스는 말그대로 OS의 process와 비슷하다. - process간의 protection을 구현한 것이다. - 접근 제어 방식이다. ### Sandbox - 새로운 앱이 설치가되면 - sandbox안에 여러 container directory를 생성한다. - Bundle container - app의 bundle - data container directory - app과 유저의 데이터를 가지고 있다. - 여러 세부 directory로 쪼개질 수 있다. - 앱은 자신의 컨테이너 디렉토리 외부의 파일에 엑세스하거나 파일을 생성하는 것을 금지된다. - 즉 자신의 sandbox안에서만 놀 수 있다. - 그런데 이런 sandbox의 예외가 존재한다. - 이 규칙의 한 가지 예외는 앱이 공용 시스템 인터페이스를 사용하여 사용자의 연락처나 음악과 같은 항목에 액세스하는 경우. 이러한 경우 시스템 프레임워크는 helper 앱을 사용하여 적절한 데이터 저장소에서 읽거나 수정하는 데 필요한 모든 파일 관련 작업을 처리합니다. ### 앱 간 데이터 공유 방법 - UIActivityViewController - 만약 AirDrop을 통해서 특정 데이터를 받고 싶다면? - In Xcode, declare support for the document types your app is capable of opening. - Xcode에서 너의 앱에서 열수 있는 문서 타입을 선언해놔라 - In your app delegate, implement the `[application:openURL:sourceApplication:annotation:](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application)` method. Use that method to receive the data that was sent by the other app. - 앱 델리겟, openURL 메소드에서 해당 데이터에대한 처리를 진행해라 - Custom URL Scheme - URL Scheme를 통해서 손쉽게 딥링크를 선언할 수 있다. - Share Extensions - 공유하기 버튼 - App Group - 하나의 앱 그룹은 여러 프로레스가 접근할 수 있는 하나의 container를 생성한다. - 일반적으로는 각 앱은 자신의 sandbox안에서만 놀지만.. - 같은 developer team에서 만든 앱들 사이에서 서로 데이터를 공유할 수 있는 기능 - Shared KeyChain Access - Keychain은 동일한 developer에게서 만들진 app일 경우 같이 공유가 가능하다. - 동일한 App ID Prefix를 가지고 있어야한다. - Custom PasteBoards - pasteboard를 활용하여 복사, 붙혀넣기 기능
soo941226 commented 5 months ago

1) 운영체제의 역할과 iOS에서의 운영체제 구조에 대해 설명해주세요.

운영체제는 한글로 들으면 조금 잘 와닿지 않는데 영어로는 Operation system입니다. 즉 실제로 하드웨어를 운영하는 시스템, 각 하드웨어를 동작시키고 연결짓는 소프트웨어입니다. 이를 통해 개발자 및 사용자들이 하드웨어를 잘 몰라도 앱을 개발하고 사용할 수 있도록 돕습니다. iOS는 위 맥락과 더불어 각 애플리케이션을 샌드박스라는 형태로 구성시킵니다. 이를 통해 특정 하드웨어와 유저 프라이버시와 연관된 데이터 접근을 반드시 운영체제를 거쳐 사용자가 허락을 했을 때만 이용할 수 있도록 만들고 있습니다.

1-a) 샌드박스가 뭔가요?

아파트 같은데 놀이터가 있으면, 해당 놀이터는 쉽게 보호받을 수 있게 됩니다. 아파트 경비원을 포함해서 주위 어른들이 아이들을 보살펴줄테니까요. 이러한 놀이터를 샌드박스라고 하는데, 시스템개발에서는 이러한 맥락을 차용하여 운영체제가 경비원의 일을 하여 위험요소로부터 사용자를 보호해주는 역할을 합니다. 사용하고자 하는 애플리케이션 자체가 위험요소일 수 있기 때문에 위에서 이야기를 드린 것처럼 특정 권한에 대해 유저가 확인을 하도록 거치기도 하는 것이고, 외부 애플리케이션이 침입하거나 하는 것을 막는 일도 합니다.

2) 프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요.

프로세스는 실제로 메모리에 올라가 실행중인 프로그램, 애플리케이션을 의미합니다. 저희가 보통 개발을 하면서 이야기하는 스레드는, 이러한 프로세스의 구성요소로 실제로 소스코드를 동작시키는 논리적 맥락인데요. 이 말이 조금 어렵게 느껴진다면 개발자가 명령을 하면, 그 명령을 수행하는 주체라고 표현해도 괜찮을 것 같습니다. 나아가 이러한 스레드는 CPU의 구성요소인 스레드와 연결되는데, 하드웨어와 관련된 부분이기 때문에, 앞서 운영체제에서 이야기를 드렸던 것처럼 결국은 운영체제가 관리를 하게 됩니다. 즉 개발자는 운영체제를 통해 하드웨어 스레드의 동작 원리나 제약을 잘 모르더라도 소프트웨어적인 스레드를 통해, 쉽게 이를 사용할 수 있게 됩니다. iOS의 프로세스 관리방법은 UIApplicationDelegate의 구성요소를 보면 쉽게 파악할 수 있는데요. 외우진 않아서 구성요소를 모두 정확히 기억하지는 않지만, foreground, background, active, suspended 등이 있는 것으로 기억합니다. 특히 NotificationCenter.default를 통해 관련 노티피케이션을 전파해서 개발자가 쉽게 활용할 수 있도록 돕고 있습니다. iOS의 스레드 관리방법은 질문의 의도를 사실 잘 모르겠는데요. 운영체제의 스레드 관리방법은 제가 운영체제 개발자가 아니라 잘 모릅니다. 일반적으로는 스레드풀이라고하는 기술을 이용하여 구현하는 것으로 알고 있는데, iOS도 그런지는 잘 모르겠습니다. 또 제가 잘 모르는 걸 보면, 운영체제를 잘 개발한 것 같습니다. 개발을 하면서 스레드를 어떻게 관리하는지 물어보는 질문이라면, NSThread를 통해 직접 생성하고 관리할 수는 있습니다. 생명주기는 ARC에 의해 관리되고, 나아가 각 스레드가 무슨 일을 하는지 관리하는 맥락이라면 또 각 스레드가 어떤 일을 할지를 결정하고 개발할 수도 있습니다. 예를 들면 2번 쓰레드는 네트워킹용, 3번 쓰레드는 데이터 처리용 등... 시스템에서 강제하는 부분도 있는데 메인스레드는 특히 UI를 갱신하는 용도로 이용됩니다. 다만 이런 관리방법은 개발자가 그만큼 정의해야할 게 많아지므로, 메인스레드를 제외하고는 요즈음에는 이런 식으로 이용하지는 않고, GCD, OperationQueue, Combine, Swift Concurrency과 같은 기술을 이용하여 스레드에 대한 관리는 최소한으로 하는 편입니다.

2-a) 왜 위 기술을 이용하면 스레드에 대한 관리를 최소한으로 할 수 있나요?

부연설명을 하면 먼저 메인스레드에서 모든 일을 하게 되면 애초에 스레드를 몰라도 됩니다. 스레드를 명시하지 않으면, 묵시적으로 거의 모든 코드는 메인 스레드에서 동작하기 때문입니다. 메인스레드에서 모든 일을 하지 않는다는 것은, 위 이야기의 연장선에서 일을 하는 주체가 여러개가 된다는 것입니다. 당연히 더 빨리 많은 일을 할 수 있게 되지만, 현실세계와 똑같이 사공이 많으면 배가 산으로 갑니다. 컴퓨터의 세계에서는 데이터가 손실되거나, 앱이 멈추거나 강제로 종료되는 일이 되는데요. 이 때문에 스레드를 이용하면 이용할수록 스레드에 대한 관리가 필요해지게 됩니다. 여기서부터는 제 주관인데요. 위 기술들 중 GCD, OperationQueue, Combine은 '사공이 많으면 배가 산으로 간다'는 문제를 극복하고자 나온 기술을 아닌 것 같습니다. 다만 어떻게 코드를 풀어나갈 것인가, 더 빨리 더 많은 일을 시키는 방법을 어떻게 구조화할 것인가에 관점으로 나온 기술로 보입니다. 어쨌거나 이를 통해 스레드를, 일을 하는 주체를 추상화하여, 실제로 여러명에게 일을 시키는 게 아니지만 여러명에게 일을 시키는 것처럼 만들어줘서, 상대적으로 관리 자체는 편해지는 편입니다. Combine은 제가 보기에 또 결이 다르기는 한데 이러한 맥락은 공유합니다. Swift concurrency는 위 기술들의 연장선에서 '사공이 많으면 배가 산으로 간다'는 관점에서 나온 기술로 보입니다. 그래서 이러한 사공들을 만들고 동기화하는 손쉬운 방법을 개발자에게 지원해주는데, 결과적으로 스레드에 대한 관리를 최소화하며, 매우 쉽게 여러명에게 일을 시켜 더 빨리 많은 일을 할 수 있도록 좋습니다.

3) 메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요.

iOS는 Automatic Reference Counting(이하 ARC)을 이용하는데요. 가장 큰 특징은 사용이 끝난 인스턴스는 메모리에서 바로 내리는 것입니다. 그리고 사용이 끝났다는 것을 체크하기 위해서 컴파일 타임에 두 가지 작업이 들어갑니다. 하나는 참조타입에 레퍼런스 카운트라는 프로퍼티를 삽입하는 것이고, 다른 하나는 인스턴스 사용 전후에 레퍼런스 카운트를 올리고 내리는 코드를 삽입하는 것입니다. 이 때 개발자는 해당 인스턴스의 성격과 함께 레퍼런스 카운팅을 고려하여 weak, unowned와 같은 키워드를 사용해 인스턴스가 매끄럽게 해제되게 만들거나, 오히려 반대로 strong 키워드를 통해 조금 더 길게 메모리에 유지되게 하는 것을 고려할 필요가 있습니다.

3-a) 더 길게 메모리에 유지되어야하는 케이스에는 어떤 게 있나요?

사실 흔치 않은 일이기에 약간의 상상력과 가정이 필요한 일인데요. 예를 들면 유저가 광고를 하나 봐야하고, 해당 광고를 다 본다는 기준이 서버에 15초를 봤다고 전송하는 것이라고 가정해보겠습니다. 그리고 사전에 모든 광고는 15초는 넘도록 정책을 정했지만, 운영 중 부득이하게 15초보다 짧은 광고들도 나오게 된 것입니다. 이를 해결하는 방법은 여러가지일 것입니다. 비용 측면에서 직관적으로 생각하면, 광고가 정책보다 짧은 경우에는 시간을 딜레이 시키는 것보다는 광고가 종료됐을 때 15초는 봤다고 서버에 전송하는 게 최선일 것 같습니다. 하지만 일단 쉬운 방법은, 해당 광고를 메모리에 일부러 더 유지시켜서 15초가 지났을 때 해제시키며 서버에 전송하는 것도 방법이 될 수 있을 것 같습니다. 앞서 말씀드린 것처럼 흔치 않은 일이라 약간 억지스러운 면이 있으나, 실제 기능구현을 할 때에도 동기화와 관련된 측면에서 한번쯤은 고려해볼 요소가 될 수 있을 것 같습니다.

4) iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요.

샌드박스에 대한 이야기는 1)과 1-a)에서 이야기를 했는데요. 앱 간 데이터 공유 방법은 질문의 의도를 잘 모르겠네요. 생각나는 걸 일단 적어보자면, 첫번째로 서버도 앱이라는 점에서 통신 프로토콜을 통해 앱 간 데이터를 공유할 수도 있고요. 두번째로 해당 서버를 통해 서로 다른 두 클라이언트가 데이터를 공유할 수도 있고요. 예를 들면 네이버 블로그 같은 것처럼 네이버 서버가 있고, 수많은 사용자들이 해당 블로그를 공유하는 것처럼요. iOS 앱 내에서 서버를 두지 않고 데이터를 공유하는 건 구체적으로는 사실 잘 모르겠는데요. 제 경험에 비추어 볼 때 Share extension을 통해 구현하거나, 클립보드를 이용하거나, URL을 통해 다른 앱을 런치시키며 데이터를 넘겨주거나 하는 방법이 있을 것 같습니다.

llimental commented 5 months ago
1. 프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요. ### 1-1) 프로세스와 스레드의 차이점 - 프로세스: 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행한 프로그램. 각각의 프로세스는 독립적인 메모리 공간을 가지며, 운영 체제에 의해 개별적으로 관리됨. 즉 다른 프로세스의 메모리에 직접적으로 접근할 수 없음. 각각의 프로세스는 최소 하나의 스레드를 포함하며 그 이상도 가능함. - 스레드: 프로세스를 구성하는 실행의 흐름 단위. 한 프로세스 내 여러 개의 스레드를 가질 수 있음. 동일한 프로세스의 메모리 공간을 공유하므로 하나의 스레드가 다른 스레드의 변수 및 자원에 직접적인 접근이 가능함. 스레드 간 통신이나 동기화가 필요한 경우 별도의 메커니즘이나 락을 사용하여 작업을 조율할 수 있음. ### 1-2) iOS에서의 프로세스와 스레드 관리 방법 - RunLoop, Timer, NSLocking, OperationQueue 등의 기능을 지원 - 일반적인 프로세스 개념에 더해 애플은 샌드박스 정책을 통해 다른 샌드박스에 접근할 수 없지만 예외적으로 helper에 대해 다른 샌드박스 권한을 지정할 수 있음(일부 맥용 패키지에서 헬퍼 앱을 설치하는 이유). - [Daemons and Services Programming Guide](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html#//apple_ref/doc/uid/10000172i) - [XPC](https://developer.apple.com/documentation/xpc)
2. 메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요 ### 2-1) 메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징 - Cocoa 애플리케이션의 메모리 관리는 가비지 컬렉션을 사용하지 않고 참조 카운팅 모델을 기반으로 함 - 객체를 생성하거나 복사할 때 객체의 보유 카운트는 1이고, 이후 다른 객체가 객체에 대한 소유권을 표현하게 되면 보유 카운트가 증가함. 반대로 객체에 대한 소유권을 포기하는 경우 보유 카운트가 감소하게 됨 - 보유 카운트가 0이 되면 객체는 할당 해제됨 - 단, iOS에서 한정이며, Mac에서는 명시적으로 메모리를 관리하거나 Objective-C의 가비지 컬렉션 기능을 사용할 수 있음 - [Memory management](https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html) - [Introduction to Memory Management](https://developer.apple.com/library/archive/documentation/mac/pdf/Memory/Intro_to_Mem_Mgmt.pdf)
3. iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요. ### 3-1) iOS의 샌드박스(Sandbox) 개념과 역할 - iOS 및 iPadOS는 샌드박스, 선언된 권한, ASLR을 사용하여 런타임 보안을 보장함. - 모든 타사 앱은 샌드박스화 되어 다른 앱이 저장한 파일에 접근하거나 기기에 변경 사항을 만들 수 없음. 이는 앱이 다른 앱에서 저장한 정보를 수집하거나 변경하는 것을 방지하도록 설계됨. - 각 앱은 고유 홈 디렉토리를 가지며 앱이 설치될 때에 임의로 할당되고, 다른 디렉토리의 정보에 접근해야 하는 경우 운영제제에서 제공하는 서비스를 통해서만 가능함 - 시스템 파일 및 리소스는 권한이 없는 Mobile 사용자로 실행되고, 전체 운영 체제 파티션은 읽기 전용으로 마운트되어 앱이 다른 앱 또는 운영체제 자체를 수정하기 위해 권한을 확대하는 것을 승인하지 않음. ### 3-2) 앱 간 데이터 공유 방법 - iOS, iPadOS, macOS에서는 확장 프로그램을 제공하여 앱이 다른 앱으로 기능을 제공할 수 있음. 이는 특정 목적을 위해 서명된 실행 가능한 바이너리로서 앱 내에 패키지되어 있음. 설치하는 동안 시스템은 자동으로 확장 프로그램을 인식하고 일치하는 시스템을 사용하는 다른 앱에서 확장 프로그램을 사용하도록 허용함. - 확장 프로그램은 자신의 주소 공간에서 실행됨. 확장 프로그램과 이를 활성화한 앱 간의 통신은 시스템 프레임워크를 통한 프로세스 간 통신을 사용함. - 확장 프로그램과 앱은 서로 간의 파일 또는 메모리 공간에 대한 접근 권한이 없고, 다른 확장 프로그램이나 앱으로부터 분리되도록 디자인되어 있음. - 시스템에서 지원하는 공유가 아니라면 같은 개발자가 구성한 그룹의 일부로 구성되어야 콘텐츠를 공유할 수 있음.
qwerty3345 commented 5 months ago

운영체제의 역할과 iOS에서의 운영체제 구조에 대해 설명해주세요.

프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요.

메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요.

iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요.

SunnnySong commented 5 months ago

0️⃣ 운영체제의 역할과 iOS에서의 운영체제 구조에 대해 설명해주세요.

운영체제

: 실행할 프로그램에 필요한 자원을 할당하는 프로그램이다.

역할

iOS에서 운영체제 구조

1️⃣ 프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요.

2️⃣ 메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요.

ARC (Automatic Reference Counting)

특징

자바의 메모리 관리 기법인 Garbage Collection과 비교해보도록 하겠다.

ARC GC
동작 컴파일 타임에 객체의 참조 횟수 추적 런타임의 백그라운드에서 동작
메모리 해제 시점 reference count가 0일때, 실시간으로 메모리 해제 불확실한 간격으로 작동되기 때문에 객체가 더 이상 사용되지 않는 시점에 정확히 해제되는 것이 아님.

3️⃣ iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요.

Sandbox

: 외부로부터 들어온 프로그램이 보호된 영역에서 동작해 시스템이 부정하게 조작되는 것을 막는 보안 형태이다. 쉽게 말하자면, 보호된 영역 안에서 프로그램을 작동시키는 보안 모델이다.

ohdair commented 5 months ago

운영체제는 Operating SystemOS으로 불리며, 실행할 프로그램을 메모리에 적재(겹치지 않도록 적당한 공간 할당)하고.

더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리하는 시스템 소프트웨어이다.

운영체제는 응용 프로그램이 최대한 공정하게 CPU 자원을 사용하도록 할당한다. 이 외에도 시스템 자원을 관리한다. 프로그램이 올바르고 안전하게 실행되게 하는 기능이 운영체제의 핵심 서비스에 속한다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel) 이라고 한다.

멀티태스킹을 지원하는 경우, 운영체제는 모든 프로세스들을 스케줄링하여 동시에 수행되는 것처럼 보이는 효과를 낸다.

iOS는 iPhone 및 iPad 장치용으로 설계한 운영체제로 Darwin을 기반으로 한다.

Apple Darwin 운영체제는 오픈소스로 배포되어 있다.

프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리

프로그램은 실행되기 전까지는 그저 보조기억 장치에 있는 데이터 덩어리일 뿐이지만, 보조기억 장치에 저장된 프로그램을메모리에 적재하고 실행하는 순간 그 프로그램은 Process가 된다. Thread는 프로세스를 구성하는 흐름의 단위이다. 프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위이다. 프로세스는 CPU 시간, 운영되기 위해 필요한 주소 공간 그리고 Code, Data, Stack, Heap의 구조로 되어있는 메모리 영역을 시스템 자원으로 할당 받는다. 프로세스는 각각 독립된 메모리 영역을 할당받는다. 기본적으로 프로세스당 최소 1개의 메인 스레드를 갖는다. 스레드는 프로세스의 특정한 수행 경로로 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.

iOS에서 프로세스를 관리하는 것은 foreground와 background에서 사용되는 것으로 구분이 되어 관리가 된다. 필요에 따라 background가 중지되거나 종료될 수 있다. 멀티태스킹이 도입되면서 여러 앱을 사용할 수 있게 되었다.

iOS에서 스레드를 GCDGrand Central Dispatch, Operation, NSThread, pthread로 관리할 수 있었으며, 현재에는 Swift Concurrency를 통해 데이터 레이스, 데드락 방지 및 다양한 동시성 문제를 해결할 수 있다.

[번외] Multiprocessing와 Multithreading 차이

Multithreading에서는 Stack을 제외한 메모리 영역을 공유하는 반면 Multiprocessing에서는 context switching이 발생하면서 오버헤드가 발생하게 된다. 그렇지만 Multithreading에서는 하나의 스레드에서 문제가 생기면 다른 스레드도 문제가 생기고, 디버깅도 어려운만큼 설계가 중요하다. 하지만 컴퓨터 시스템 자원을 적게 소모하는 장점이 있다.

메모리 관리 기법 중 iOS에서 사용되는 방식과 특징

Objective-C에서는 수동으로 메모리를 C언어와 같이 직접 관리를 했다면, Swift에서는 ARC를 사용하여 앱의 메모리 사용량을 추적하고 관리한다. 메모리 관리가 Swift에서 작동을 의미하며, 직접 생각할 필요가 없다. 해당 인스턴스가 더 이상 필요하지 않을 때 인스턴스에서 사용하는 메모리를 자동으로 해제한다.

ARC는 현재 각 클래스 인스턴스를 참조하는 properties, constants 그리고 variables의 수를 추적한다. 활성 참조가 하나 이상 존재하는 한 인스턴스 할당을 해제하지 않는다. 해당 인스턴스를 확고하게 유지하고 참조가 남아있는 경우 할당 해제할 수 없기 때문에 strong refence라고 한다.

iOS의 샌드박스 개념과 역할, 앱 간 데이터 공유 방법

Core OS Layer에는 앱 보안과 관련된 기능을 구현한다. 그 중에서도 Sandbox는 악성 코드가 앱을 악용하는 경우 도난, 손상 또는 삭제된 사용자 데이터에 대한 최후의 방어선을 제공한다. 또한, 코딩 오류로 인한 피해를 최소화한다.

그 전략으로 두 가지가 존재한다.

  1. 앱이 시스템과 상호작용하는 방식을 설명할 수 있다. 그런 다음 시스템은 앱에 작업을 완료하는 데 필요한 액세스 권한만 부여하고 그 이상은 부여하지 않는다.
  2. 사용자가 열기 및 저장 대화 상자, 드래그 앤 드롭 및 사용자 상호 작용을 사용하여 앱에 추가 액세스 권한을 투명하게 부여할 수 있다.

Network, Hardware, App data, User Files를 사용하려면 의도를 명시해야 한다. 명시적으로 요청되지 않은 리소스에 대한 접근(권한을 초과하는 부분)은 런타임 시 시스템에 의해 거절된다.

정리된 블로그 링크

JasonLee0223 commented 5 months ago
프로세스와 스레드의 차이점, iOS에서의 프로세스와 스레드 관리 방법에 대해 설명해주세요.
프로세스는 하나의 프로그램으로 인식하고 스레드는 그 프로그램에서 수행되는 작업(Task라고 표현하는)들을 말합니다. iOS 학습 단계에서는 보통 GCD를 이용하여 처음 경험해보며 세마포어(Semaphore)를 통해 스레드를 관리하였습니다. 해당 과정에서 싱글턴(Singleton) 디자인패턴을 사용하여 공유 자원을 이용하게끔 환경을 구축 한 뒤 경쟁 상태(Race Condition)를 경험해보았습니다. 이후 학습 역량이 향상되며 Swift-Concurrency의 async-await을 사용해보며 보다 작업을 관리하기 쉬웠던 경험을 해보았습니다.
메모리 관리 기법 중 iOS에서 사용되는 방식과 그 특징에 대해 설명해주세요.
iOS에서는 크게 Swift의 출시 전과 후로 나누어 비교하여 설명할 수 있습니다. Objective-C 기반으로 개발을 진행할 때는 MRC(Manual Reference Counting)를 사용하여 개발자가 직접 메모리 관리를 해야 했습니다. alloc/new/copy/mutableCopy와 같은 메서드로 생성된 객체는 참조 카운트가 1이며, 사용 후에는 release를 호출하여 참조 카운트를 감소시켜야 합니다. 객체를 변수에 할당할 때는 retain을 호출하여 참조 카운트를 증가시키고, 더 이상 필요하지 않을 때 release나 autorelease를 사용하여 감소시킵니다. Swift 기반으로 개발을 진행하기 시작하며 iOS 5와 함께 도입된 ARC(Automatic Reference Counting)를 사용하여 개발자가 직접 관리하지 않아도 된다는 부담을 줄여주게 됩니다. ARC 동작 방식은 객체의 참조가 필요 없어지면 자동으로 메모리에서 해제됩니다. 하여 메모리 누수인 순환 참조를 방지하기 위해 weak와 strong 참조를 적절히 사용해야 합니다. 가장 대표적인 예시로 Delegate 패턴을 사용하는 경우를 들 수 있습니다.
iOS의 샌드박스(Sandbox) 개념과 역할, 앱 간 데이터 공유 방법에 대해 설명해주세요.
iOS에서 샌드박스는 앱이 운영 체제의 다른 부분과 격리된 환경에서 실행되게 하는 보안 기술입니다. 이 샌드박스 환경은 앱이 시스템의 나머지 부분과 사용자의 다른 데이터에 무단으로 접근하는 것을 방지합니다. 이로써 각 앱은 자신만의 데이터와 리소스를 가지며, 이 데이터는 기본적으로 다른 앱과 공유되지 않습니다. 앞서 말한 내용을 토대로 보안 강화, 데이터 보호, 시스템 안정성 3가지 역할을 수행합니다. 이런 보호 지침으로 인해 앱 간 데이터 공유 방법이 까다롭지만 개발 목적, 데이터 유형, 사용자 경험 등 다양한 요인에 따라 달라질 수 있습니다. 그러나 일반적으로 많이 사용되는 방법들을 살펴보면 `URL Schemes`, `UIActivityViewController`, `App Groups` 등을 들 수 있습니다.
ueunli commented 5 months ago

프로세스와 스레드의 차이