# Concurrency Programming
## 동시성(Concurrency) 프로그래밍, 병렬(Parallelism) 프로그래밍은 어떻게 다르며, 우리가 주로 접할 iOS 환경에서는 무엇을 더 고려해봐야 할까?
- 동시성 프로그래밍 : 논리적인 개념, 논리적 스레드 사용, 여러 스레드가 번갈아 가며 실행
- 병렬 프로그래밍 : 물리적인 개념, 물리적 스레드 사용, 여러 스레드를 동시에 실행
## 동시성 프로그래밍, 병렬 프로그래밍, 동기(synchronous)와 비동기(asynchronous)의 개념은 어떤 상관관계를 가질까?
- 동기 : 순차적으로 작업이 실행되는 방식
- 비동기 : 작업이 끝나는 것을 기다리지 않고 실행과 동시에 다음 작업으로 넘어가는 방식
병렬은 동기와 비동기를 물리적 스레드를 사용해서 처리해준다.
동시성은 동기와 비동기를 논리적 스레드를 사용해서 처리해준다.
## 애플이 동시성 프로그래밍 또는 병렬 프로그래밍을 지원하기 위해 사용하는 기술엔 무엇무엇이 있을까?
- GCD(Grand Central Dispatch) : 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 할 수 있도록 애플이 개발한 기술, 스레드 풀의 관리를 프로그래머가 아닌 운영체제에서 관리하기 때문에 프로그래머가 태스크(작업)를 비동기적으로 쉽게 사용할 수 있다
- OpenCL(Open Computing Language) : 컴퓨터의 그래픽 프로세서에서 범용 계산을 수행하기 위한 표준 기반 기술, 데이터를 병렬로 처리할 수 있는 문제 세트에 적합하다.
- NSOperation : Object-C 언어 기반의 고수준 API, 내부적으로는 C로 구현된 GCD를 고수준 언어로 Wrapping 한 것으로, GCD보다 무겁다. 작업 취소, KVO, 작업 재사용 등 GCD에 비해 고성능 기능을 제공한다.
## 프로그래밍에서 Thread는 무엇이고 iOS 환경에서 이를 다루기 위한 방법에는 무엇무엇이 있으며 그 차이는 무엇일까?
- 작업(코드 실행)이 가능한 공간
- ios 환경에서 이를 다루기 위한 방법:
- Debug navigator: thread를 구분하여 대기중인 call이 enqueue되는 시점을 알려줍니다.
- NSLog와 os_log: 우측 하단 console창에 호출된 thread를 식별할 수 있는 번호를 print해줍니다.
- Time Profiler: 다른 thread의 활동을 기록해줍니다.
- Thread Sanitizer: 발생할 수 있는 문제를 감지합니다.
# Process, Processor
## Windows 운영체제는 32bit 버전, 64bit 버전, ARM 버전 등 다양한 버전이 존재합니다. 이 버전은 어떤 것을 의미하며 왜 이렇게 다양한 버전이 존재해야 할까요?
- 32bit와 64bit는 CPU에서 정보가 처리되는 차이를 나타내며, 연산 속도의 차이나 인식 가능한 메모리의 차이가 존재합니다.
- ARM은 ...
## 내 매킨토시의 프로세서는 무엇인가요?
- M1
## 애플이 새로 출시한 매킨토시 컴퓨터에서 iOS의 애플리케이션을 실행할 수 있는 이유는 무엇일까요?
- 애플 실리콘 기반 ARM을 사용하게 되면서 인텔과 호환되지 않았던 iOS의 애플리케이션도 실행 가능하게 되었습니다. 이는 아이패드와 아이폰의 A시리즈 칩 역시 ARM 프로세스 아키텍처를 기반으로 설계되었기 때문입니다.
## 이전의 매킨토시 컴퓨터에서는 불가능했던 이유는 무엇일까요?
- ARM과 인텔 프로세스 아키텍처가 호환되지 않았기 때문입니다.
## 프로세서를 위한 프로세스 스케쥴링 방식에는 어떤 것이 있는지 간략히 알아봅시다.
- FCFS 스케줄링 : CPU를 먼저 요청한 프로세스가 먼저 CPU를 배정받는 스케줄링 방법
- SJF 스케줄링 : CPU 한차례 사용시간(CPU burst time)이 작은 프로세스부터 먼저 끝내 convoy effect를 최소화하는 방법
- Round Robin (RR) 스케줄링 : 각 프로세스가 주로 10 ~ 100ms의 동일한 크기의 할당 시간(Time quantum)을 갖는다. 할당 시간이 끝나면 프로세스는 자동으로 선점(Preempted)당하고, Ready queue의 제일 뒤에 가서 다시 줄을 선다.
- Priority Scheduling : 특정 기준으로 프로세스에게 우선순위를 부여해 우선순위가 제일 높은 프로세스에게 CPU를 할당하는 방식이다.
- Multiple-Processor Scheduling :
- 비대칭 방식(Asymmetric multiprocessing) : 오직 한 프로세서가 시스템 데이터에 대한 접근과 공유를 책임지고, 나머지 프로세서는 해당 CPU를 따르는 방식이다.
- 대칭 방식(Symmetric multiprocessing, SMP) : 각 프로세서가 각자 알아서 스케줄링하는 방식이다.
## 운영체제 입장에서 다양한 프로세스를 스케쥴링하는 규칙을 만들어봅시다.
-
# 보너스
## 앞으로 iOS와 macOS는 통합될까요?
-