Post

Coroutine vs Thread

Coroutine vs Thread

Kotlin: 코루틴(Coroutine) vs 쓰레드(Thread) 비교

Kotlin에서 코루틴과 쓰레드는 모두 동시성 프로그래밍을 위한 기술이지만, 몇 가지 중요한 차이점이 있습니다.

쓰레드 (Thread)

  • 정의: 프로그램이 메모리에 올라가서 실행될 때 이를 프로세스라고 하며, 쓰레드는 이 프로세스 안에서 더 작은 작업의 단위를 의미합니다. 프로그램은 하나의 메인 쓰레드(실행 흐름)를 가지며, 별도의 자식 쓰레드를 생성하여 로직을 동시에 실행할 수 있습니다.
  • 작업 단위: Thread 자체가 하나의 작업 단위입니다.
  • 메모리: 각 Thread는 독립적인 Stack 메모리 영역을 가집니다. 이는 쓰레드를 생성할 때 스택 메모리의 일정 영역을 차지하게 됨을 의미합니다.
  • 동시성 보장 수단: 운영체제에 의한 Context Switching (컨텍스트 스위칭)을 통해 동시성을 보장합니다. 컨텍스트 스위칭은 쓰레드의 실행 순서가 운영체제에 의해 결정되며, 이는 쓰레드 간의 전환 시 오버헤드가 발생할 수 있습니다.
  • 특징: 무분별하게 쓰레드를 생성하면 메모리 자원 소모가 크고, 컨텍스트 스위칭 오버헤드로 인해 성능 저하가 발생할 수 있습니다.

코루틴 (Coroutine)

  • 정의: 운영체제의 깊이 있는 지식이 없어도 쉽게 비동기 프로그래밍을 할 수 있도록 돕는 기술입니다. 하드웨어 자원의 효율적인 할당을 가능하게 하며, 안정적인 동시성 및 비동기 프로그래밍을 지원합니다.
  • 작업 단위: Coroutine Object가 하나의 작업 단위입니다.
  • 메모리: Coroutine ObjectJVM Heap에 적재됩니다 (Kotlin 기준). 쓰레드처럼 별도의 스택 영역을 할당하지 않습니다.
  • 동시성 보장 수단: Programmer Switching (No-Context Switching)을 통해 동시성을 보장합니다. 개발자가 소스 코드를 통해 전환 시점을 마음대로 정할 수 있으며, 운영체제가 관여하지 않습니다.
  • 특징:
    • 경량 (Light-Weight): 쓰레드보다 훨씬 가볍게 사용할 수 있으며, 하나의 쓰레드에서 다수의 코루틴을 수행할 수 있습니다. CPU 자원을 절약하므로 “Light-Weight Thread”라고도 불립니다.
    • Suspend (Non-Blocking): 한 코루틴 객체가 다른 코루틴의 결과를 기다릴 때, 해당 코루틴의 상태는 Suspend로 바뀌지만, 이를 수행하던 쓰레드는 그대로 유효합니다. 따라서 기다리는 코루틴도 동일한 쓰레드에서 실행될 수 있습니다.
    • 협동 실행: 로직들이 협동해서 실행하는 것을 목표로 하며, Google에서 Kotlin의 코루틴 사용을 적극 권장하고 있습니다.
    • 쓰레드 대체 기술 아님: 코루틴은 쓰레드를 대체하는 기술이 아니라, 하나의 쓰레드를 더욱 잘게 쪼개서 효율적으로 사용하는 기술입니다.

코루틴과 쓰레드의 주요 차이점 요약

특징쓰레드 (Thread)코루틴 (Coroutine)
작업 단위ThreadCoroutine Object
메모리각 쓰레드가 독립적인 Stack 메모리 영역을 가짐JVM Heap에 Coroutine Object가 적재됨
동시성 수단운영체제에 의한 Context Switching개발자에 의한 Programmer Switching (No-Context Switching)
자원 소모비교적 무거움 (각 쓰레드가 스택 메모리 할당)비교적 가벼움 (하나의 쓰레드에서 여러 코루틴 수행)
목적로직 동시 실행 지원운영체제 지식 없이 비동기 프로그래밍 용이
관계프로세스 내의 작은 작업 단위쓰레드를 대체하는 것이 아닌, 쓰레드를 더 효율적으로 활용하는 기술
This post is licensed under CC BY 4.0 by the author.