Kotlin Coroutine - 코루틴이란 무엇인가?

일단 코루틴의 개념을 알아보기 전에 코루틴은 코틀린만 있는 개념은 아니다(이름이 비슷해서 많이 헷갈릴수도..). 이미 C#, Python, Go, JavaScript 등 여러 언어에서 지원하는 개념이다. 코루틴은 코틀린만의 것이 아님을 이해하며 아래 글을 읽어보면 조금이나마 도움이 될 것이다.

그래서 Coroutine이 무엇인가?

우선 Wikipedia의 코루틴 정의를 보자.

Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed.
코루틴은 실행과 재개를 허용함으로써 비선점형 멀티태스킹을 위한 서브루틴을 일반화한 컴퓨터 프로그램의 구성 요소이다.

비선점형 멀티태스킹은 뭐고 서브루틴은 뭘까? 일단 이 두가지부터 이해해보자.

루틴(Routine)과 서브루틴(Subroutine)

루틴(Routine)은 컴퓨터 프로그램에서 하나의 정리된 task이다. 프로그램은 보통 크고 작은 루틴을 결합하여 만든다.

루틴은 다시 메인 루틴(Main Routine)과 서브루틴(Subroutine)으로 나뉜다.

  • 메인 루틴(Main Routine) : 프로그램 전체의 개괄적인 동작 절차를 표시하는 루틴이다.
  • 서브루틴(Subroutine) : 반복되는 특정 기능을 모아놓고 여기에 이름을 붙여 놓은 것이다. 코틀린에서는 함수가 대표적인 서브루틴의 예시이다.

코루틴(Coroutine, Cooperative Routine)도 루틴의 일종이다. 다만 이를 서브루틴과 비교했을 때 몇가지 차이점이 있는데,

  1. 코루틴은 메인-서브 관계가 없다. 즉 모든 코루틴이 서로를 호출할 수 있다.
  2. 서브루틴은 진입 지점과 탈출 지점(return)이 각각 하나씩만 존재하지만, 코루틴은 내부적으로 여러개의 진입 지점과 탈출 지점을 가질 수 있다. -> 중간에 멈춰서 특정 위치로 갔다가 다시 돌아와서 나머지 일을 할수 있다.
  3. 2와 같은 서브루틴과 코루틴의 성질로 인해 서브루틴은 메인 루틴에 종속적이지만 코루틴은 메인 루틴에 종속적이지 않아 대등하게 데이터를 주고받을 수 있다.

비선점형 멀티태스킹(Non-preemptive multitasking)과 선점형 멀티태스킹(Preemptive multitasking)

특정 Task가 CPU의 사용권을 얻었을 때, 이 사용권을 강제로 뺏을 수 없으면 비선점형 멀티태스킹, 뺏을 수 있으면 선점형 멀티태스킹이다.

코틀린에서 코루틴은 비선점형 멀티태스킹이며 쓰레드는 선점형 멀티태스킹이다. -> 코틀린은 동시성(Concurrency)을 제공하지만 병렬성(Parallelism)을 제공하지 않는다.

..계속해서 모르는 단어가 나온다.. 그래서 동시성이랑 병렬성은 뭔데?

동시성(Concurrency)

하나의 Thread에서 여러 Task가 동시에 실행되는 것처럼 보이게 하는 것(대부분은 시분할로 동시성을 구현한다).

병렬성(Parallelism)

여러 Task가 동시에 실행되는 것처럼 보이게 하기 위해 여러개의 Thread를 사용.

그럼 이 둘의 차이가 뭘까?

  • 먼저 CPU가 제공하는 Thread의 수는 제한되어 있다(6코어 12스레드의 그 스레드 맞다). 그럼 병렬성을 구현할 때 Thread 개수가 초과되면? 운영체제에서 Context Switching 기법을 이용해 스레드를 교체한다(이것도 시분할을 많이 사용). 근데 이 Context Switching은 생각보다 비용이 많이 드는 작업이다. 따라서 Single Thread로 동시성을 제공하는 코루틴은 이 부분에서 성능적으로 이득이 될 가능성이 높다.
  • Thread간의 작업 교환은 System Call 또는 Blocking Call을 사용하는데, 이것 또한 코루틴의 작업 교환보다 비용이 많이 든다.
  • 여러 Thread의 동기화를 위한 Mutex, Semaphore 기법 등을 코루틴에서는 사용할 필요가 없다.

결론적으로 코루틴은 여러 Task가 동시성을 구현하면서도 스레드보다 비용이 적은 멀티태스킹 방식이라고 할 수 있다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6