코루틴 이해하기

코루틴은 Co + Routines의 합성어로 “여러개의 루틴이 함께 협력한다”라는 의미를 가진다. 지연과 재개를 할 수 있다는 특징과 비선점 멀티태스킹의 서브루틴 형태로 협력형 태스크와 비슷하게 동작한다.

코루틴이란

코루틴은 아래의 키워드를 이용해서 정의할 수 있다.

  1. 비선점 멀티태스킹(non-preemptive)서브루틴(subroutine) 형태
  2. 지연(suspend)재개(resume)가 가능함
  3. 협력형(cooperative) 멀티태스크와 비슷하게 동작함

하나씩 살펴보자.

비선점 멀티태스킹

OS의 스케줄링을 공부하다보면 선점(preemptive)이라는 단어를 마주하게 된다. CPU와 같은 컴퓨터의 한정적인 자원을 이용해서 여러 개의 태스크(프로세스 혹은 스레드)를 동시에 실행하기 위해서는 자원을 어떻게 분할하여 사용할지에 대한 정책이 필요하다. 스케줄링은 이러한 정책을 정의한다. 즉 처리할 일들의 진행순서를 정하는 것이다.

스케줄링은 적용 시점에 따라서도 선점형과 비선점형 2가지로 구분할 수 있다.

  • 선점형 스케줄링(preemptive): 어떤 프로세스가 CPU를 할당받아 실행 중에 있어도 스케줄러가 실행 중인 프로세스를 강제로 중지하고 다른 프로세스에게 CPU를 할당 할 수 있다. 모든 프로세스에게 CPU 사용 시간을 동일하게 부여할 수 있다. (ex. 시분할 스케줄링)
  • 비선점형 스케줄링(non-preemptive): 어떤 프로세스가 CPU를 할당 받으면 그 프레소스가 종료되거나 입출력 요구가 발생하여 자발적으로 중지될 때까지 계속 실행되도록 보장한다. 순서대로 처리되는 공정성이 있고 다음에 처리해야 할 프로세스와 관계없이 응답 시간을 예상할 수 있으며 선점 방식보다 스케줄러 호출 빈도가 낮고 문맥 교환(Context Switching)에 의한 오버헤드가 적다.

비선점 멀티태스킹은 코루틴을 이해하는데 있어 중요한 키워드이다. 위의 정리된 내용에 이해가지 않는 부분이 있다면 다른 자료들을 참고해서 꼭 이해하고 넘어가자.

서브루틴

서브루틴은 반복되는 특정 기능을 별도로 묶어 놓아 이름을 붙인 것으로 보통 함수나 메서드라고 불린다. 서브루틴은 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 다시 원래 호출자의 위치로 돌아가게된다.

지연과 재개

코루틴이 비선점 멀티태스킹의 서브루틴 형태라는 것을 이해한다면 지연과 재개의 필요성은 자연스럽게 이해할 수 있다.
여러 스레드가 CPU 스케줄링의 관리 아래에서 협력적으로 동작한다면, 코루틴은 스레드 내에서 자발적인 지연과 재개를 통해 협력적으로 동작한다. CPU 스케줄링에 직접적인 영향을 받지 않기 때문에 지연과 재개가 필요한 것이다.

CPS (Continuation Passing Style)
스케줄링에 의해서 현재 CPU를 할당받아 실행되고 있는 스레드가 다른 스레드로 교체될 때는 문맥 교환이 발생하지만, 코루틴은 스레드 내에서 CPS를 이용해서 지연과 재개가 가능하다.

코루틴 vs 스레드

지금까지의 내용을 바탕으로 코틀린 코루틴과 스레드를 다음과 같이 비교할 수 있다.

  • 코틀린 코루틴
    • 기본적으로는 협력형이며 병행적으로 동작하지 않는다. (옵션을 통해서 여러개의 스레드로 분할하여 병행적으로 동작하게 할 수 있다.)
    • 스케줄러가 실행시점을 결정하는 것이 아닌 프로그래머나 이벤트에 의해 실행 및 지연(Suspend), 재개(Resume) 시점이 결정된다.
    • 비선점형 멀티태스크, 동시성(Concurrency)을 제공한다.
    • 독립적으로 스택을 가질 수도 있으나 일반적으로 스택을 갖지 않는다.
  • 스레드
    • CPU 수에 따라서 완전히 병행적으로 동작할 수 있다.
    • OS의 스케줄러가 실행 시점을 결정한다. (스케줄러가 선점한다.)
    • 선점형 멀티태스크, 멀티프로세싱, 병행성을 제공한다.
    • 스레드별 독립적인 스택을 가진다.

결과

일반적으로 스레드 한개를 생성하는데 필요한 메모리는 1M 정도로, 2000개 정도의 스레드를 생성하기 위해서는 1.5GB 이상의 메모리가 필요하다. 그러나 100만 개의 코루틴은 700MB 미만의 메모리면 충분하다.

결과적으로 컨텍스트 스위칭과 같은 비용이 많이 드는 작업 없이 지연과 재개를 이용한 비선점 멀티태스킹 방식으로 동시성을 프로그래밍을 가능하게 한다.

Author

KimJongMin

Posted on

2021-03-21

Updated on

2021-03-22

Licensed under

댓글