운영체제 역할과 iOS 운영체제 구조: Process, Thread, ARC, Sandbox
운영체제는 Operating SystemOS으로 불리며, 실행할 프로그램을 메모리에 적재(겹치지 않도록 적당한 공간 할당)하고.
더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리하는 시스템 소프트웨어이다.
운영체제는 응용 프로그램이 최대한 공정하게 CPU 자원을 사용하도록 할당한다. 이 외에도 시스템 자원을 관리합니다. 프로그램이 올바르고 안전하게 실행되게 하는 기능이 운영체제의 핵심 서비스에 속한다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel) 이라고 한다.
멀티태스킹을 지원하는 경우, 운영체제는 모든 프로세스들을 스케줄링하여 동시에 수행되는 것처럼 보이는 효과를 낸다.
iOS는 iPhone 및 iPad 장치용으로 설계한 운영체제로 Darwin
을 기반으로 한다.
Apple Darwin 운영체제는 오픈소스로 배포되어 있다.
- User Experience: iOS 사용자 인터페이스 및 사용자가 상호 작용하는 애플리케이션
- Cocoa touch: iOS 앱을 빌드하는 데 필요한 주요 프레임워크가 포함
- Media: 그래픽, 오디오 및 비디오를 위한 프레임워크, iOS 앱에 멀티미디어 관련 기능을 제공
- Core Services: 시스템 서비스, 저수준 루틴, 모델, 컬렉션 및 데이터 유형, wrapper에 대한 액세스를 제공
- Core OS: 이미지 처리, 선형 대수학, 복소수 및 대수, 네트워킹, 메모리 관리, 파일 시스템, 스레드 등 상위 계층에 필요한 저수준 기능 및 서비스
프로세스와 스레드의 차이점, 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라고 한다.
ARC 동작
- 클래스의 새 인스턴스를 생성
- 해당 인스턴스에 대한 정보를 저장하기 위해 메모리 청크를 할당
- 메모리에는 인스턴스 형식에 대한 정보와 인스턴스와 연결된 저장된 속성 값 저장
- 더 이상 필요하지 않은 경우 메모리를 해제
iOS의 샌드박스 개념과 역할, 앱 간 데이터 공유 방법
Core OS Layer에는 앱 보안과 관련된 기능을 구현한다. 그 중에서도 Sandbox는 악성 코드가 앱을 악용하는 경우 도난, 손상 또는 삭제된 사용자 데이터에 대한 최후의 방어선을 제공한다. 또한, 코딩 오류로 인한 피해를 최소화한다.
그 전략으로 두 가지가 존재한다.
- 앱이 시스템과 상호작용하는 방식을 설명할 수 있다. 그런 다음 시스템은 앱에 작업을 완료하는 데 필요한 액세스 권한만 부여하고 그 이상은 부여하지 않는다.
- 사용자가 열기 및 저장 대화 상자, 드래그 앤 드롭 및 사용자 상호 작용을 사용하여 앱에 추가 액세스 권한을 투명하게 부여할 수 있다.
Network, Hardware, App data, User Files를 사용하려면 의도를 명시해야 한다. 명시적으로 요청되지 않은 리소스에 대한 접근(권한을 초과하는 부분)은 런타임 시 시스템에 의해 거절된다.