개발

process vs thread vs coroutine

현욱 정리장 2026. 10. 20. 11:22

1. Process 

* 실행 중인 프로그램의 인스턴스 - 독립적인 가상 주소 공간과 시스템 자원을 가짐 

2. Thread

* 프로세스 내부의 실행 단위. 같은 프로세스의 스레드끼리는 힙 메모리 등을 공유하지만, 각자의 실행 스택을 가짐 

 

3. Coroutine

중단과 재개가 가능한 경량 작업 단위. 스레드를 효율적으로 공유하며 비동기 작업을 처리 

 

프로세스는 스레드들이 모여서 만들어지는 개념이라기보다 자원과 주소 공간을 관리하는 실행 환경
(그 안에서 하나 이상의 스레드가 실행됨)

 

Q1. 프로세스와 스레드의 가장 큰 차이점 

프로세스는 실행 중인 프로그램의 인스턴스로 독립적인 가상 주소 공간과 시스템 자원을 가짐

스레드는 프로세스 내부에서 실행되는 단위.

같은 프로세스의 스레드들은 healp 메모리와 자원을 공유하지만 각자 별도의 스택을 가짐

따라서 프로세스는 자원 관리의 단위이고 스레드는 실행의 단위라는 큰 차이가 있음 

 


Thread 기반 블로킹 대기 

1. Thread.sleep() 처럼 블로킹하면 대기하는 동안에도 해당 스레드를 점유합니다.

2. Coroutine의 중단 가능한 대기 

delay()로 중단된 코루틴은 스레드를 블로킹하지않습니다. 그동안 해당 스레드는 다른 작업을 수행할 수 있습니다. 

 

* Thread: OS가 스케줄링하는 실행 단위이며, 각 스레드마다 스택 등 관리 비용이 발생합니다.

* Coroutine: Kotlin 런타임이 중단, 재개 상태를 관리하는 경량 작업 단위입니다.

* Dispatcher: Coroutine을 어떤 스레드에서 실행할지 결정하는 역할을 합니다. 

 

Dispatcher.IO는 공유 스레드 풀을 활용합니다. 

기본 병렬 실행한도는 일반적으로 max(64, CPU 코어 수) 이고, 조정 가능합니다.

이는 코루틴 개수의 제한도, 항상 생성되는 스레드 개수도 아닙니다.

 

Q2. Coroutine과 Thread

repeat(1_000) {
    CoroutineScope(Dispatchers.IO).launch {
        delay(1000)
        println("완료")
    }
}

1. 코루틴 1000개를 실행하면 쓰레드 1000개가 생성될까? 

-> Coroutine 1,000개를 실행한다고 Thread가 1,000개 생성되지는 않습니다.

Coroutine은 Thread 자체가 아니라 Thread 위에서 실행되는 경량 작업 단위 

Dispatcher가 여러 코루틴을 공유 스레드에 배치합니다.

특히 delay() 같은 suspend 함수로 중단되면 실행 상태를 보존하고 Thread를 점유하지 않기 때문에

상대적으로 적은 Thread로 많은 동시 작업을 처리할 수 있습니다. 

다만 코루틴 내부에서 블로킹 작업을 수행하면 해당 스레드가 점유될 수 있으므로, 코루틴을 사용한다고 모든 작업이 자동으로 논블로킹되는건아닙니다. 

2. 코루틴이 쓰레드보다 가볍다고 하는 이유는? 

 


1. viewModelScope는 기본적으로 Main Dispatcher 사용 

2. Thread.sleep()는 메인 스레드를 차단해 ANR 가능

다만 무조건 ANR은 아님, 3초 동안 메인 스레드를 막는건 문제지만 실제 ANR 발생 여부는 상황과 안드로이드 감지 기준에 따라 달라짐 

3. delay()는 실행 상태를 보존 -> delay() 자체는 메인 스레드를 블로킹하지 않지만, ANR이 절대 발생하지 않는 것은 아님 

예를 들어 delay() 이후 메인 스레드에서 무거운 연산을 수행하면 여전히 ANR을 발생할 수도있음 

 

A. viewModelScope는 기본적으로 Main Dispatcher를 사용함 

Thread.sleep()은 현재 실행 중인 스레드를 블로킹하기 때문에, 메인 스레드에서 실행하면 UI 이벤트 처리가 중단되고, 

상황에 따라 ANR이 발생할 수 있습니다. 

반면 delay()는 suspend 함수로 Coroutine의 실행상태를 보존한 채 중단하고 메인 스레드를 다른 작업에 사용할 수 있도록 합니다.

따라서 UI 관련 코루틴에서 대기 시간이 필요하다면 delay()를 사용하는 것이 적절합니다. 

delay()가 모둔 ANR을 방지하는건 아닙니다. 

'개발' 카테고리의 다른 글

Coroutine Dispatcher 와 스레드풀  (0) 2026.10.23
Flow  (0) 2026.09.07
Coroutine exception handling  (0) 2026.09.04
structured concurrency  (1) 2026.07.13
let, run, apply, also, with  (0) 2026.07.08