코루틴 vs 쓰레드: 차이점 정리
1. 기본 개념
쓰레드 (Thread)
- 운영체제(OS)가 관리하는 작업 단위이다.
- 여러 쓰레드가 동시에 실행되며 멀티코어 CPU를 활용해 병렬 처리가 가능하다.
- 쓰레드마다 독립적인 실행 컨텍스트(레지스터, 스택 등)가 필요하며, 이를 관리하는 비용이 높다.
코루틴 (Coroutine)
- 사용자(프로그래머)가 관리하는 경량화된 작업 단위이다.
- 비동기 작업을 수행하며, 필요할 때 작업을 중단(suspend)하고 재개(resume)할 수 있다.
- 단일 쓰레드에서 실행되지만, 동시성을 제공해 여러 작업이 동시에 실행되는 것처럼 보이게 한다.
2. 비유
- 쓰레드: 여러 사람이 각자 자기 트랙에서 동시에 달리는 모습이다.
- 코치(OS)가 사람들을 관리하며, 관리 비용이 크다.
- 코루틴: 한 사람이 여러 가지 일을 번갈아 가며 처리하는 모습이다.
- 코치가 필요 없고, 사람이 스스로 일의 순서를 조정한다.
3. 주요 차이점
특징 쓰레드(Thread) 코루틴(Coroutine)
관리 주체 | 운영체제(OS) | 사용자 (프로그래머) |
비용 | 무거움 (스택, 레지스터 전환 비용 발생) | 가벼움 (스택 사용 안 함) |
병렬 처리 | 여러 코어에서 진짜 동시에 실행 가능 | 한 코어에서 순차적으로 실행됨 |
사용 사례 | CPU 집중 작업 (대규모 계산 작업) | IO 작업 (네트워크, 파일 읽기/쓰기) |
전환 방식 | OS 스케줄러가 작업을 전환 | 프로그래머가 직접 전환 (suspend/resume) |
4. 언제 어떤 걸 써야 할까?
- 쓰레드: CPU를 많이 사용하는 작업에서 유리하다.
- 예: 대규모 데이터 처리, 병렬 계산, 영상 렌더링.
- 코루틴: 비동기적이고 IO 작업이 많은 경우 적합하다.
- 예: 네트워크 요청, 파일 읽기/쓰기, 사용자 인터페이스 업데이트.
5. 예제 코드
쓰레드 예제 (동시에 실행)
fun main() {
val thread1 = Thread {
println("Thread 1 실행")
}
val thread2 = Thread {
println("Thread 2 실행")
}
thread1.start()
thread2.start()
}
코루틴 예제 (비동기로 실행)
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("Coroutine 1 실행")
}
launch {
println("Coroutine 2 실행")
}
}
- 쓰레드: OS 스케줄러가 스레드들을 병렬로 실행한다.
- 코루틴: 이벤트 루프 기반으로 비동기적으로 작업을 실행한다.
6. 요약
- 쓰레드는 무겁지만 병렬 처리가 필요한 CPU-bound 작업에 적합하다.
- 코루틴은 가볍고, IO-bound 작업(네트워크 요청, 파일 처리)에 적합하다.
'seok' 카테고리의 다른 글
결합도와 응집도 (0) | 2024.06.25 |
---|---|
테스트용-데이터베이스를 임베디드 모드 (0) | 2024.05.31 |
Querydsl프로젝트 설정,여러팁/비공개 (0) | 2024.03.27 |