Developing Myself Everyday
article thumbnail

사진: UnsplashNick Russill

 

 

 

코루틴을 언제 사용하는가?

여러 작업을 동시에 수행하는 애플리케이션을 만들기 위해, 즉 "동시성"을 구현하기 위해 Kotlin은 코루틴을 사용합니다.

 

JVM과 Kotlin/Native 환경에서, 코루틴을 포함한 모든 동시성 코드는 OS가 관리하는 스레드 위에서 실행됩니다. 코루틴은 스레드를 블로킹(Blocking)하지 않고 실행을 중단(Suspend) 할 수 있습니다.

 

이를 통해 하나의 코루틴이 어떤 데이터가 도착하기를 기다리며 중단되어 있는 동안, 같은 스레드에서 다른 코루틴이 실행될 수 있어, 시스템 자원을 효율적으로 사용할 수 있습니다.

 

 

코루틴과 스레드 비교

스레드는 운영체제가 관리합니다. 스레드는 여러 CPU 코어에서 작업을 병렬로 실행할 수 있으며, JVM에서 동시성을 구현하는 전통적인 방식입니다. 

 

스레드를 생성하면 운영체제는 해당 스레드를 위한 스택 메모리를 할당하고, 커널을 통해 스레드 간 컨텍스트 스위칭(Context Switching)을 수행합니다. 이 때문에 스레드는 강력하지만 리소스 소모가 큽니다.

 

각 스레드는 보통 수 MB의 메모리를 필요로 하며, 일반적으로 JVM에서는 수천 개 수준의 스레드만 동시에 처리할 수 있습니다.

 

반면 코루틴은 특정 스레드에 묶여있지 않습니다. 한 스레드에서 중단되었다가 다른 스레드에서 다시 실행될 수 있기 때문에, 여러 코루틴이 하나의 스레드 풀을 공유할 수 있습니다. 코루틴이 중단되면 해당 스레드는 블로킹되지 않고, 다른 작업을 실행할 수 있는 상태로 유지됩니다.

 

이러한 특성 덕분에 코루틴은 스레드보다 훨씬 가볍고, 시스템 자원을 고갈시키지 않으면서 하나의 프로세스에서 수백만 개의 코루틴을 실행할 수 있습니다.

 

 

결론

결론적으로, 코루틴은 스레드가 아니라 스레드 위에서 실행되는 중단되었다가 다시 재개될 수 있는 작업 단위입니다.

 

스레드에 비해 매우 가볍기에 경량 스레드라는 식으로 불리기도 하지만, 사실 이는 개념적으로 정확한 표현은 아니라고 생각합니다.

 

코루틴을 경량 스레드라 말하면, 코루틴이 스레드를 대체하는 존재라 이해할 수 있기에 정확하게 이해하지 못한 사람들에게 오해를 줄 수 있기에 경량 스레드라고 말할때는 뒷 배경을 정확하게 설명해줘야 한다고 생각합니다.

 

 

 

 

Reference

https://kotlinlang.org/docs/coroutines-basics.html#comparing-coroutines-and-jvm-threads

https://medium.com/@natalia.kulbaka/what-exactly-is-a-coroutine-a-lightweight-thread-have-you-used-to-answer-like-this-too-d204d1e7e744

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!