[Kotlin] 쓰레드와 코루틴의 차이

[Kotlin] 쓰레드와 코루틴의 차이

💡 동시성 프로그래밍을 다시 정리해보자

  • 설명
    • 쓰레드와 코루틴은 둘 다 동시성 프로그래밍을 위한 기술이다.
    • 동시성 프로그래밍 기술은 컨텍스트 스위칭이 중요한 개념이다.

💡 쓰레드와 코루틴의 차이를 정리해보자

  • 쓰레드

    • 작업 하나하나의 단위 : Thread

      • 각 Thread 가 독립적인 Stack 메모리 영역을 가진다.
    • 동시성 보장 수단 : Context Switching

      • 운영체제 커널에 의한 Context Switching 을 통해 동시성을 보장한다.

      • 블로킹(Blocking)

        • Thread A가 Thread B 의 결과를 기다리고 있다.
      • 이 때, Thread A는 블로킹 상태라고 할 수 있다.

        • A는 Thread B 의 결과가 나올 때 까지 해당 자원을 사용하지 못한다.

    예시

    img

  • Thread A가 Task 1을 수행하는 동안 Task 2 의 결과가 필요하면 Thread B를 호출한다.

  • 이때 Thread A는 블로킹 되고 Thread B로 프로세스간에 스위칭이 일어나 Task 2을 수행한다.

  • Task 2가 완료되면 Thead A로 다시 스위칭해서 결과 값을 Task 1에게 반환한다.

  • 이때 Task 3, Task 4는 A, B작업이 진행되는 도중에 멈추지 않고 각각 동시에 실행되게 된다.

  • 이때 컴퓨터 운영체제 입장에서는 각 Task를 쪼개서 얼마나 수행할지가 중요한데

  • 그래서 어떤 쓰레드를 먼저 실행해야할지 결정하는행위를 스케쥴링이라고 한다.

  • 이러한 행위를 통해 동시성을 보장한다.


  • 코루틴

  • 작업 하나하나의 단위 : Coroutine Object

    • 여러 작업 각각에 Object 를 할당한다.
    • Coroutine Object 도 엄연한 객체이기 때문에 JVM Heap 에 적재 한다.(코틀린 기준)
  • 동시성 보장 수단 : Programmer Switching (No-Context Switching)

    • 소스 코드를 통해 Switching 시점을 마음대로 정한다. (OS는 관여하지 않아요)

    • Suspend(Non-Blocking)

      • Object 1이 Object 2의 결과를 기다릴 때 Object 1의 상태는 Suspend로 바뀐다.
      • 그래도 Object 1을 수행하던 *Thread는 그대로 유효하다*
      • 그래서 Object 2도 Object 1과 동일한 Thread에서 실행된다.

예시

img

  • Coroutine은 작업 단위가 Object라고 했다.
  • Task 1을 수행하다가 Task 2의 수행요청이 발생했다고 가정해보겠다.
  • 신기하게도 컨텍스트 스위칭 없이 동일한 Thread A에서 수행할 수 있다.
  • Thread C처럼 하나의 쓰레드에서 여러 Task Object들을 동시에 수행할 수 있다.
  • 이러한 특징때문에 코루틴을 Light-Weight Thread라고 이야기한다.
    • 동시처리를 위해 스택영역을 별도로 할당하는 쓰레드처럼 동작하지 않는다.
    • 하지만 동시성을 보장할 수 있다.
    • 하나의 쓰레드에서 다수의 코루틴을 수행할 수 있다.
    • 커널의 스케쥴링을 따르는 컨텍스트 스위칭을 수행하지 않는다.
  • 요약
    • 쓰레드나 코루틴은 각자의 방법으로 동시성을 보장하는 기술이다.
    • 코루틴은 Thread를 대체하는 기술이 아니다.
    • 하나의 Thread를 더욱 잘개 쪼개서 사용하는 기술이다.
    • 코루틴은 쓰레드보다 CPU 자원을 절약하기 때문에 Light-Weight Thread라고 한다.
    • 구글에서는 코틀린의 코루틴 사용을 적극 권장하고 있다.

© 2023. All rights reserved.

AgileCatch