Start Coroutine
Coroutine 은 Co + Routine 즉 협력한다는 뜻의 Co (Cooperate) 와 루틴 (작업 실행 단위)의 합성어 이다.
Coroutine 은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다.
기존의 비동기 작업과 Coroutine 의 차이가 뭘까?
🔵 Context Switching (문맥 교환)
Single-Core (단일 CPU, 병렬 x) 에서 동시성 프로그래밍을 기준으로 설명한다.
비동기 작업을 하는데 사용되는 대표적인 방법으로 OS-level thread(kernerl, native thread) 를 사용한다.
설명하려는 문맥 교환은 Kernel-level 임을 알아두자. Thread 의 문맥 교환의 단위는 Stack 과 TCB (Task Control Bloack) 이다.

Context Switch는 CPU의 레지스터에서 일어나는 과정이다.
즉 Task 가 바뀔 때마다 Stack (자체 메모리 영역) 과 TCB 를 복사, 복구하는 일을 매번 해야 된다는 것이다.
일반적으로 스레드 환경에서는 스레드가 실제로 유용한 작업을 수행하는 시간을 크게 줄이기 위해 실제로 이러한 스레드를 스케줄링 하는데 낭비되는 오버헤드의 양이 최대 30~50개 라고 한다.
각 스레드는 자체 스택을 할당해야 하기 때문에 메모리 사용량이 스레드 수에 따라 선형적으로 증가한다.
Coroutine 은 이와 같은 Context Switching 과정이 없다.
따라서 매우 적은 오버헤드로 매우 높은 수준의 동시성을 제공할 수 있다.
Thread

Coroutine

앞서 말했던 Context Switching 에 대한 이미지 이다. Coroutine 의 작업 단위는 Coroutine Object 객체 이므로 Heap 메모리에서 작동한다. 하나의 스레드에서 여러 Coroutine Object 들이 서로 양보하거나 완료될 때까지 실행되어 서로 협력 한다.
Coroutine은 간단한 작업을 수행하고 서로 간에 자발적으로 전환하는 많은 루틴을 통해 운영체제 스케줄러가 달성할 수 없는 효율성 수준에 도달했다.
💙 참고 페이지
Coroutines guide | Kotlin
Difference between a "coroutine" and a "thread"?
임베디드 레시피