본문 바로가기
seok

코루틴 vs 쓰레드

by shulk 2025. 1. 12.

코루틴 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