Coroutine과 Thread 비교

Dabin Lee·2023년 3월 8일
0

Android

목록 보기
1/1
post-thumbnail

Kotlin을 사용하던 도중 비동기 프로그래밍을 위해 찾아보던 중에 Coroutine 개념을 접하게 되었다. 동기와 비동기는 대기(blocking)가 필요한 작업들이 빈번한 프로그래밍에서 자주 등장한다.

동기 : 요청을 보낸 후 요청에 대한 반환값을 얻기 이전까지 대기
비동기 : 요청을 보낸 후 요청에 대한 반환값을 얻기 전까지의 대기시간동안 다른 일을 수행


Process & Thread

Process : 프로그램이 메모리에 적재되어 실행되는 인스턴스
Thread : Process 내 실행되는 여러 흐름의 단위

Process는 독립된 메모리 영역인 Heap을 할당받고 Thread도 독립된 메모리 영역인 스택(Stack) 메모리를 할당받는다. 즉, 하나의 Thread를 생성하면, 하나의 스택 메모리가 할당되는 것이다. 각 Thread는 다른 Thread에게 스택 메모리를 공유할 수 없다. 그러나 Process에 속한 Heap은 속해있는 모든 Thread가 공유할 수 있다.


Concurrency & Parallelism

Concurrency(동시성)

Interleaving, 시분할 : 다수의 Task가 있을 때, 각 Task들을 평등하게 조금씩 나누어 실행하는 것


총 실행시간은 Context Switching에 대한 비용을 제외하곤 각 Task 수행시간을 합친 것과 동일하다.

Parallemlism(병렬성)

Parallelizing, 병렬수행 : 다수의 Task가 있을 때, 각 Task들이 한 번에 수행되는 것


Task의 수만큼 자원이 필요하며, Context Switching은 필요하지 않다. 총 실행 시간은 다수의 Task 중 가장 소요시간이 긴 Task만큼 걸린다.

Thread와 Coroutine은 모두 동시성 프로그래밍을 위한 기술이다.


Thread VS Coroutine

Thread

  • Task 단위 = Thread
    * 각각의 작업들에 Thread를 할당
    • 각 Thread는 자체 스택 메모리를 가지며 JVM Stack 영역을 차지함
  • 동시성 보장 - Context Switching
    * Blocking : Thread A가 Thread B의 결과가 나올 때까지 대기해야 한다면 Thread A은 Blocking 되어 Thread B의 결과가 나올 때까지 해당 자원을 사용하지 못한다.

Coroutine

  • Task 단위 = Coroutine Object
    • 각각의 작업들에 Coroutine Object를 할당
    • Coroutine Object도 엄연한 객체이므로 JVM Heap에 적재됨
  • 동시성 보장 - Programmer Switching(No-Context Switching)
    • 프로그래머의 코드를 통해 Switching 시점을 마음대로 정함(OS의 관여 X)
    • Suspend(Non-Blocking) : Object 1이 Object 2의 결과가 나올 때까지 대기해야 한다면 Object 1은 Suspend 되지만, Object 1을 수행하던 Thread는 그대로 유효하므로 Object 2도 Object 1과 동일한 Thread에서 실행될 수 있다.
    • 하나의 Thread에서 다수의 Coroutine을 수행할 수 있고, Context Switching이 필요없는 특성에 따라 Coroutine을 Light-weight Thread(경량 쓰레드)라고 부른다.

결론

작업의 단위를 Object로 축소함에 따라 하나의 Thread가 다수의 Coroutine을 다룰 수 있기 때문에, 작업 하나하나에 Thread를 할당하면서 메모리 낭비, Context Switching 비용 낭비를 할 필요가 없다.


참고자료

0개의 댓글