Coroutine vs Thread
Coroutine vs Thread
Kotlin: 코루틴(Coroutine) vs 쓰레드(Thread) 비교
Kotlin에서 코루틴과 쓰레드는 모두 동시성 프로그래밍을 위한 기술이지만, 몇 가지 중요한 차이점이 있습니다.
쓰레드 (Thread)
- 정의: 프로그램이 메모리에 올라가서 실행될 때 이를 프로세스라고 하며, 쓰레드는 이 프로세스 안에서 더 작은 작업의 단위를 의미합니다. 프로그램은 하나의 메인 쓰레드(실행 흐름)를 가지며, 별도의 자식 쓰레드를 생성하여 로직을 동시에 실행할 수 있습니다.
- 작업 단위:
Thread
자체가 하나의 작업 단위입니다. - 메모리: 각 Thread는 독립적인 Stack 메모리 영역을 가집니다. 이는 쓰레드를 생성할 때 스택 메모리의 일정 영역을 차지하게 됨을 의미합니다.
- 동시성 보장 수단: 운영체제에 의한 Context Switching (컨텍스트 스위칭)을 통해 동시성을 보장합니다. 컨텍스트 스위칭은 쓰레드의 실행 순서가 운영체제에 의해 결정되며, 이는 쓰레드 간의 전환 시 오버헤드가 발생할 수 있습니다.
- 특징: 무분별하게 쓰레드를 생성하면 메모리 자원 소모가 크고, 컨텍스트 스위칭 오버헤드로 인해 성능 저하가 발생할 수 있습니다.
코루틴 (Coroutine)
- 정의: 운영체제의 깊이 있는 지식이 없어도 쉽게 비동기 프로그래밍을 할 수 있도록 돕는 기술입니다. 하드웨어 자원의 효율적인 할당을 가능하게 하며, 안정적인 동시성 및 비동기 프로그래밍을 지원합니다.
- 작업 단위:
Coroutine Object
가 하나의 작업 단위입니다. - 메모리:
Coroutine Object
는 JVM Heap에 적재됩니다 (Kotlin 기준). 쓰레드처럼 별도의 스택 영역을 할당하지 않습니다. - 동시성 보장 수단: Programmer Switching (No-Context Switching)을 통해 동시성을 보장합니다. 개발자가 소스 코드를 통해 전환 시점을 마음대로 정할 수 있으며, 운영체제가 관여하지 않습니다.
- 특징:
- 경량 (Light-Weight): 쓰레드보다 훨씬 가볍게 사용할 수 있으며, 하나의 쓰레드에서 다수의 코루틴을 수행할 수 있습니다. CPU 자원을 절약하므로 “Light-Weight Thread”라고도 불립니다.
- Suspend (Non-Blocking): 한 코루틴 객체가 다른 코루틴의 결과를 기다릴 때, 해당 코루틴의 상태는
Suspend
로 바뀌지만, 이를 수행하던 쓰레드는 그대로 유효합니다. 따라서 기다리는 코루틴도 동일한 쓰레드에서 실행될 수 있습니다. - 협동 실행: 로직들이 협동해서 실행하는 것을 목표로 하며, Google에서 Kotlin의 코루틴 사용을 적극 권장하고 있습니다.
- 쓰레드 대체 기술 아님: 코루틴은 쓰레드를 대체하는 기술이 아니라, 하나의 쓰레드를 더욱 잘게 쪼개서 효율적으로 사용하는 기술입니다.
코루틴과 쓰레드의 주요 차이점 요약
특징 | 쓰레드 (Thread) | 코루틴 (Coroutine) |
---|---|---|
작업 단위 | Thread | Coroutine 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.