[참고]
Coroutine 이란?
프로그램이 실행될때 불려지도록 만들어진 프로그램의 중심이 되는 일련의 코드들을 Main Routine(메인 루틴) 이라고 하며, Main Routine외에 다른 Routine 들을 모두 Subroutine(서브루틴)이라고 합니다. 그리고 진입하는 지점을 여러개 가질 수 있는 Subroutine을 Coroutine(코루틴)이라고 합니다. Coroutine은 호출한 Routine을 대등한 관계로 호출할 수 있기 때문에 다른 Routine의 종속관계가 아니라고 표현하기도 합니다.
C++에서는 main 함수가 Main Routine 이고 그 외에 다른 함수들은 모두 Subroutine 이라고 볼 수 있습니다. 따라서 Coroutine은 함수 내에서 호출한 쪽을 다시 호출할 수 있고 다시 다른 Routine에서 함수의 중간 지점을 호출할 수 있는 것이라고 할 수 있습니다.
Coroutine 은 Thread와 비슷하다?
보통 Coroutine을 Thread와 비슷한 개념이라고 말하기도 하는데, 이 때문에 Coroutin 이해를 어렵게 만든다. 결과적으로는 비슷한면이 많다. Thread와 Coroutine 모두 자신만의 스택이 존재하고 실행 순서를 가진다. 하지만 Coroutine은 Thread가 아니다.
Thread란 프로그램 내에서 실행되는 흐름의 단위를 말한다. 모든 프로그램은 최소 하나의 Thread를 가지며, 이 Thread를 Main Thread(주 스레드) 라고 한다. 그리고 이 Main Thread 에서 Main Routine이 불려진다. Thread는 흐름이 단위이기 때문에 새로운 Thread가 만들어졌다는 것은 새로운 시간 흐름이 만들어졌다고 볼 수 있다. 이렇게 프로그램은 여러 개의 Thread를 동시에 실행할 수도 있고, 이것으로 인해 일종의 흐름이 동시에 진행될 수 있습니다. 이러한 실행 방식을 Multithread(멀티스레드)라고한다.
독립적인 시간 흐름을 가지고 Routine을 실행하는 것이 바로 Thread이다. 그래서 보통의 Routine들은 시작부터 끝까지 하나의 thread에서 실행되지만 Coroutine은 호출자를 다시 호출할 수 있고 진입 지점을 여러 개 가질 수 있다는 특성 때문에 여러 Thread에서 하나의 Coroutine이 실행될 수 있다. 이런 특성때문에 Coroutine이 비동기 로직 처리에 유용하게 사용될 수 있다.
Context Switching 비용이 너무 커서 부담스럽다?
Context Switchcing은 보통 Thread와 밀접한 관계를 가지고있다.. 위에서 Thread는 독립적인 시간 흐름을 가지고 Routine을 실행하는 것 이라고 했는데, Thread가 하나 존재한다면 Routine이 하나의 시간 흐름속에서 실행이 된다. 그렇다면 이러한 Thread가 100개 존재한다면 어떻게 실행되어야 할까?
100개의 Thread가 독립적인 시간 흐름을 가지기 때문에 100개의 Routine이 모두 동시에 실행이 되어야 하지만, 보통 사용하는 컴퓨팅 환경에서는 그렇게 동작하지 않는다.
Routine은 어떠한 작업을 위한 명렁어들로 이루어져 있는데 이 명령어들을 해석하는 연산하는 것이 CPU이다. CPU는 여러 개의 Core를 가지기도 있다. Core가 하나인 CPU이면 동시에 처리할 수 있는 연산은 하나이다. 다라서 100개의 Thread가 동시에 연산되려면 100개의 Core가 필요하다.
보통의 OS 들은 OS가 Thread의 CPU 점유를 제어하여 실행될 수 있도록 한다. 한정된 자원ㅇ르 분할해서 수백개의 Thread가 동시에 실행될 수 있도록 한다. 이 과정에서 Thread들은 CPU 자원을 차지하기 위해 경쟁을 하게 되고 그렇게 CPU 자원을 선점한 Thread가 Routine을 실행할 수 있다. 이것이 Preemptive Multitasking(선점형 멀티태스킹)이다.
Preemptive Multitaxking 에서는 어느 한 Thread가 CPU 자원을 독점할 수 없기 때문에 모든 Thread가 계속 경쟁을 해서 CPU 자원을 선점하게 되고, Thread가 CPU 자원을 선점하면 다른 Thread는 실행이 중단될 수 있다. 이렇게 CPU 자원을 선점하는 과정에서 이전에 CPU 자원을 사용하고 있던 Context의 정보를 저장하고 새로 선점한 Context의 정보를 가져오는 것을 Context Switching 이라고 한다.
Context Switching은 독립적인 정보를 가지고 명령어를 실행하기 위해 생기는 현상이다.
끄읕.