동시성 프로그래밍
동기적(Synchronous)수행
- 순서대로 작업을 수행하여 하나의 루틴을 완료한 후 다른 루틴을 실행하는 방식
- 다양한 기능이 한꺼번에 일어나는 다중 실행 환경에서는 성능상의 제약 발생
- 예) UI, 데이터 다운로드를 동시에 대응해야 하는 경우
비동기적(asynchronous)수행
- 다양한 기능을 동시에 수행할 수 있는 방식
- 전통적인 스레드를 이용하거나 RxJava, Reactive와 같은 서드파티(third-party)라이브러리에서 제공
- 코틀린에서는 코루틴(Coroutine)을 기본으로 제공
코루틴
- 먼저 하나의 개별적인 작업을 루틴(routine)이라고 부르는데 여러개의 루틴들이 협력(co)한다는 의미로 만들어진 합성어
- 코틀린의 코루틴을 사용하는 넌블로킹(non-blocking) 또는 비동기 코드를 마치 일반적인 동기 코드처럼 쉽게 작성하면서도 비동기 효과를 낼 수 있다.

프로세스와 스레드
태스크 개념
- 보통 태스크는 큰 실행 단위인 프로세스(process)나 좀 더 작은 실행 단위인 스레드(thread)로 생각할 수 있다.
- 프로세스는 실행되는 메모리, 스택, 열린 파일 등을 모두 포함하기 떄문에 프로세스간 문맥 교환(context-switching)을 하는 데 비용이 큼