코루틴을 이해하기 전에 알아야 할 개념: 동기 vs 비동기, 블로킹 vs 논블로킹
코루틴을 이해하려면, 동기/비동기와 블로킹/논블로킹의 차이를 먼저 알아야 한다.
1. 동기(Synchronous) vs 비동기(Asynchronous)
- 동기: 어떤 작업이 시작되면, 그 작업이 끝날 때까지 다른 일을 하지 않고 기다려야 한다. 즉, 요청이 끝날 때까지 스레드는 그 작업에 묶여 있게 된다.
- 비동기: 작업을 시작하고, 그 작업이 끝나기 전에 다른 일을 계속할 수 있다. 요청 결과가 언제 오든 상관없이 다른 작업을 할 수 있는 유연함이 있다.
2. 블로킹(Blocking) vs 논블로킹(Non-blocking)
- 블로킹: 스레드가 어떤 작업을 처리하는 동안 다른 작업을 하지 못하고 대기 상태에 빠진다. 이 경우, 스레드는 제어권을 잃고, 작업이 완료될 때까지 아무것도 할 수 없다.
- 논블로킹: 스레드는 작업을 처리하는 동안 대기하지 않고, 제어권을 유지하며 다른 작업을 계속 처리할 수 있다.
예시: 스프링에서의 동기/비동기, 블로킹/논블로킹
- 스프링 기본 설정 (동기 + 블로킹):
- 예를 들어, 10개의 스레드를 가진 스레드풀에 20개의 요청이 들어오면, 10개의 스레드가 데이터베이스 요청을 보낸다. 기본적으로 동기이기 때문에, 스레드는 요청이 완료될 때까지 기다리며 다른 작업을 할 수 없다. 이 경우 스레드는 블로킹 상태에 있다.
- @Async를 사용한 비동기 설정 (비동기 + 논블로킹):
- 스레드가 비동기적으로 요청을 보낸 후, 그 스레드는 반납되거나 다른 작업을 처리할 수 있다. 요청이 완료되기를 기다리지 않으며, 스레드는 제어권을 유지한다.
블로킹 vs 논블로킹의 관점에서
- 블로킹: 스레드는 요청에 대한 응답을 받을 때까지 대기하며 다른 작업을 수행하지 못한다. 이 경우 스레드는 제어권을 잃고, 요청이 완료될 때까지 아무것도 할 수 없다.
- 논블로킹: 스레드는 요청을 보낸 후, 응답이 오기 전에도 다른 작업을 계속 수행할 수 있다. 제어권을 유지하고, 작업 간 전환이 유연하게 이루어진다.
동기/비동기와 블로킹/논블로킹의 조합
- 블로킹 동기: 요청이 완료될 때까지 스레드가 대기하고, 완료되면 즉시 그 작업을 처리한다.
- 논블로킹 비동기: 요청을 보낸 후 스레드는 제어권을 유지하며, 응답이 오면 그때 작업을 처리하거나, 다른 스레드가 처리할 수 있다.
참고: 논블로킹 동기나 블로킹 비동기 같은 조합은 직관적으로 이해하기 어렵고, 실제로 잘 사용되지 않는다. 대부분의 경우, 논블로킹 비동기 모델이 더 효율적이며, 비동기와 논블로킹을 결합하여 더 나은 성능을 얻을 수 있다.
코루틴과 스레드의 차이점: 경량 스레드로서의 코루틴
코루틴은 코틀린 공식 가이드에서 "경량 스레드"로 소개되고 있다. 이는 코루틴이 스레드보다 가벼운 개념이지만, 완전히 동일한 것은 아니다.
스레드에서의 비동기 처리
스레드에서 비동기 작업을 수행할 때, 작업 중이던 A 스레드가 비동기 요청을 보내면 B 스레드가 생성되어 해당 작업을 이어받는다. 이 과정에서 스레드 간 전환(Context Switching)이 발생하며, 이는 CPU와 메모리 등 시스템 자원을 많이 소모한다.
위 사진은 스레드에서 비동기 처리를 할 때 각 작업이 서로 다른 스레드에서 실행되는 것을 보여준다. 각 스레드의 ID가 다르다는 점에 주목할 수 있다.
코루틴에서의 비동기 처리
반면, 코루틴은 하나의 스레드 내에서 객체로 존재하며, 동일한 스레드 내에서 시분할을 통해 여러 작업을 번갈아 가며 처리할 수 있다. 이 때문에 추가적인 스레드 생성이나 스레드 간 전환이 필요하지 않으며, 컨텍스트 스위칭 비용이 크게 줄어든다.
위 사진은 코루틴을 사용하여 동일한 스레드에서 비동기 작업이 처리되는 것을 보여준다. 모든 작업이 동일한 스레드 ID를 가진다.
주요 차이점
- 경량성: 코루틴은 동일한 스레드 내에서 여러 작업을 처리하기 때문에, 스레드보다 훨씬 가볍다. 이는 스레드가 새로운 스레드를 생성해 동시성을 유지하는 것과 비교해 매우 큰 차이를 만든다.
- 자원 효율성: 코루틴은 메모리와 CPU 자원을 적게 소모하면서도, 수백만 개의 코루틴을 동시에 실행할 수 있다. 반면, 스레드는 수백만 개를 생성하면 시스템 자원이 부족해질 수 있다.
이로 인해 코루틴은 스레드보다 더 효율적이며, "경량 스레드"라는 별칭이 붙게 된 것이다.
'코틀린' 카테고리의 다른 글
코틀린에서 컬렉션, 확장 함수, 함수형 프로그래밍, 스코프 함수 사용 방법 (0) | 2024.06.26 |
---|---|
코틀린에서 클래스와 객체를 다루는 방법 (0) | 2024.06.26 |
코틀린에서 코드를 제어하는 방법 (0) | 2024.06.26 |
코틀린에서 변수와 타입, 연산자를 다루는 방법 (0) | 2024.06.26 |