Kotlin을 사용하던 도중 비동기 프로그래밍을 위해 찾아보던 중에 Coroutine 개념을 접하게 되었다. 동기와 비동기는 대기(blocking)가 필요한 작업들이 빈번한 프로그래밍에서 자주 등장한다.
동기 : 요청을 보낸 후 요청에 대한 반환값을 얻기 이전까지 대기
비동기 : 요청을 보낸 후 요청에 대한 반환값을 얻기 전까지의 대기시간동안 다른 일을 수행
Process : 프로그램이 메모리에 적재되어 실행되는 인스턴스
Thread : Process 내 실행되는 여러 흐름의 단위
Process는 독립된 메모리 영역인 Heap을 할당받고 Thread도 독립된 메모리 영역인 스택(Stack) 메모리를 할당받는다. 즉, 하나의 Thread를 생성하면, 하나의 스택 메모리가 할당되는 것이다. 각 Thread는 다른 Thread에게 스택 메모리를 공유할 수 없다. 그러나 Process에 속한 Heap은 속해있는 모든 Thread가 공유할 수 있다.
Interleaving, 시분할 : 다수의 Task가 있을 때, 각 Task들을 평등하게 조금씩 나누어 실행하는 것
총 실행시간은 Context Switching에 대한 비용을 제외하곤 각 Task 수행시간을 합친 것과 동일하다.
Parallelizing, 병렬수행 : 다수의 Task가 있을 때, 각 Task들이 한 번에 수행되는 것
Task의 수만큼 자원이 필요하며, Context Switching은 필요하지 않다. 총 실행 시간은 다수의 Task 중 가장 소요시간이 긴 Task만큼 걸린다.
Thread와 Coroutine은 모두 동시성 프로그래밍을 위한 기술이다.
작업의 단위를 Object로 축소함에 따라 하나의 Thread가 다수의 Coroutine을 다룰 수 있기 때문에, 작업 하나하나에 Thread를 할당하면서 메모리 낭비, Context Switching 비용 낭비를 할 필요가 없다.