# Concurrency Programming
> 동시성(Concurrency) 프로그래밍, 병렬(Parallelism) 프로그래밍은 어떻게 다르며, 우리가 주로 접할 iOS 환경에서는 무엇을 더 고려해봐야 할까?
동시성 프로그래밍은 다중 스레드를 활용하는 방법이다.
병렬 프로그래밍은 다중 코어를 활용하는 방법이다.
코어에 작업분배는 운영체제가 담당하기 때문에 따라서 iOS를 구현하면서 직접 병렬 프로그래밍을 구현할 일은 없을 것 같다.
> 동시성 프로그래밍, 병렬 프로그래밍, 동기(synchronous)와 비동기(asynchronous)의 개념은 어떤 상관관계를 가질까?
동시성 프로그래밍은 다중 스레드를 활용하는 방법이다.
병렬 프로그래밍은 다중 코어를 활용하는 방법이다.
동기/ 비동기 : 스레드 수와는 무관.
- 동기 : 현재 진행중인 작업이 끝나기를 기다림. 작업 종료시간 알 수 있음.
- 비동기 : 현재 진행중인 작업이 끝나기를 기다리지 않음. 작업 종료시간 알 수 없음.
> 애플이 동시성 프로그래밍 또는 병렬 프로그래밍을 지원하기 위해 사용하는 기술엔 무엇무엇이 있을까?
- GCD
- Dispatch queues
- Dispatch source
- Operation
- Operation
- Operation queues
> 프로그래밍에서 Thread는 무엇이고 iOS 환경에서 이를 다루기 위한 방법에는 무엇무엇이 있으며 그 차이는 무엇일까?
- 물리적인게 아니라 논리적인 스레드.
- 스레드는 코드에 대한 별도의 실행 경로를 나타낸다.
- 내부에서 작업 단위가 되는 가상의 스레드.
- 하나의 스레드가 작업을 처리하는 것 보다, 여러 개의 스레드에 작업을 분산 시켜서 하는 것이 효율적일 수도 있음.
- 이 친구는 물리적인 스레드의 개수와는 상관없이 많이 만들 수 있음.
- 스레드를 다루기 위한 방법
- NSThread
- POSIX Threads
---
## Process, Processor
> Windows 운영체제는 32bit 버전, 64bit 버전, ARM 버전 등 다양한 버전이 존재합니다. 이 버전은 어떤 것을 의미하며 왜 이렇게 다양한 버전이 존재해야 할까요?
- 프로세서의 스펙이 다 다르기 때문에
> 내 매킨토시의 프로세서는 무엇인가요?
- M1
> 애플이 새로 출시한 매킨토시 컴퓨터에서 iOS의 애플리케이션을 실행할 수 있는 이유는 무엇일까요?
- iOS의 애플리케이션은 컴파일될 때 ARM 아키텍처 기반의 명령어(RISC)로 변환이된다.
- 새로 출시한 매킨토시 컴퓨터도 ARM 아키텍처로 만들어졌다.
- 따라서 네이티브 성능으로 iOS 앱이 구동 가능하다.
> 이전의 매킨토시 컴퓨터에서는 불가능했던 이유는 무엇일까요?
- 이전의 매킨토시 컴퓨터의 프로세서는 x86 아키텍처이기 때문에 ARM 아키텍처 기반의 명령어를 해석할 수 없었다.
> 프로세서를 위한 프로세스 스케쥴링 방식에는 어떤 것이 있는지 간략히 알아봅시다.
- 선입 선처리 스케줄링
- 준비 큐에 삽입된 순서대로 CPU를 할당한다.
- 최단 작업 우선 스케줄링
- 준비 큐에 삽입된 프로세스들 중 CPU 사용 시간의 길이가 가장 짧은 프로세스부터 CPU를 할당한다.
- 라운드 로빈 스케줄링
- 정해진 시간만큼만 돌아가며 CPU를 할당한다.
- 우선순위 스케줄링
- 가장 높은 우선순위를 가진 프로세스에 CPU를 할당한다.
- 다단계 피드백 큐 스케줄링
- 프레서스들이 큐 사이를 이동할 수 있는 다단계 큐 스케줄링이다.
> 운영체제 입장에서 다양한 프로세스를 스케쥴링하는 규칙을 만들어봅시다.
## 보너스
> 앞으로 iOS와 macOS는 통합될까요?
- 아니요! 각 OS마다 사용이유가 다르고, OS를 분리하면 조금 더 최적화에 유리하니까요.