코루틴이란?
- co-routine = 협력하는 + 함수
- ‘실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소’
- 코루틴은 병행성은 제공하지만, 병렬성은 제공하지 않는다. (= 물리적이 아닌, 논리적으로 작업이 동시에 실행되는 것처럼 보이는 것)
비선점적 멀티태스킹이란?
- 비선점형: 하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없음(코루틴은 명시적으로 양보해야 전환됨)
- 선점형: 하나의 프로세스가 다른 프로세스 대신에 CPU를 강제로 차지할 수 있음(thread는 스케쥴링 기준에 따라 CPU를 사용하도록 되어있음, 즉 애플리케이션 코드가 아닌 다른 요소에 의해 강제로 변경됨)
코루틴 사용
fun main(): Unit = runBlocking {
println("[main]START")
launch {
newRoutine()
println("[new1]TEST")
}
yield()
println("[main]END")
}
suspend fun newRoutine() {
val num1 = 1
val num2 = 2
yield()
println("[new2]${num1 + num2}")
}
/*
[main]START
[new1]TEST
[new2]3
[main]END
*/
- runBlocking: 일반 루틴 세계와 코루틴 세계를 연결하는 함수, 새로운 코루틴을 생성
- launch함수: 주로 반환 값이 없는 코루틴을 만들 때 사용
- yield(): 양보하다 = 지금 코루틴의 실행을 잠시 멈추고 다른 코루틴이 실행되도록 양보하겠다.
- suspend키워드: 함수가 실행 도중 비동기적으로 일시 중단(suspend)되었다가 다시 재개될 수 있음을 나타냄
공부하다보니, Context Switching 비용을 줄여 효율적으로 서비스할 수 있다는 점에서 Java의 Virtual Thread와 아주 유사하다는 생각이 들어 비교 정리를 해보았다.
코루틴과 Virtual Thread
코루틴의 동작
1) 하나의 함수가 실행되다가, yield()를 명시적으로 작성하거나 보통 I/O 호출할 때 라이브러리 내부적으로 양보함
2) 다른 함수의 동작 실행하다가 또 yield되면
3) 1번 과정에서 중지된 함수 재개
Virtual Thread의 동작
1) 커널 스레드가 CPU를 점유하면 매핑된 자바 스레드에 mount된 Virtual Thread 실행
2) Virtual Thread는 실행 중 Block되면 mount되어 있던 자바 스레드에서 unmount됨
3) 다른 Virtual Thread가 자바 스레드에 mount되어 실행됨
공통점
- OS단의 Thread는 선점형 스케줄링
차이점
- 코루틴 = 비동기 흐름을 동기 처럼 표현(내부적으로는, 적은 Thread를 사용하여 함수들 간에 협력하여 동시성을 확보)
- virtual thread = block 허용, block에 대한 비용을 줄임
참고) webflux = block X (=non-blocking, 이벤트 기반)임으로, 코루틴을 활용하기도 함
'Programming > Kotlin' 카테고리의 다른 글
| [Kotlin] 이펙티브 코틀린 (0) | 2026.03.31 |
|---|---|
| Kotlin의 기초 (0) | 2026.03.28 |