코루틴에 대해 자세히 알아보기 전 프로세스와 스레드의 개념을 알아보고 코루틴에 대해 자세히 알아보자
쉽게 컴퓨터에서 실행되고 있는 프로그램이다. 코드와 리소스 등이 집합되어 있는 프로그램이 실행되어 메모리에 올라가면 프로세스로 동작하게 된다.
ex) 크롬 브라우저의 탭도 프로세스로 생성관리한다.

스레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다. 프로세스보다 더 작은 개념으로, 프로세스에 소속되어 여러 코드를 동시에 실행할 수 있게 해준다.
일반적으로 하나의 프로세스는 하나의 스레드를 가지는 싱글 스레드 방식이지만 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있으며 멀티 스레드라고 한다.

프로세스가 스레드보다 큰 개념이듯 스레드가 코루틴보다 큰 개념이다.
다만, 스레드-코루틴을 프로스세스-스레드에 빗대기에 차이점이 있다.
스레드 1과 2에서 코루틴 1과 2의 코드1 코드3이 실행되고 있다.
이후 초록색 부분에 의해 코루틴 1의 코드1이 중단되며, 스레드 1에 코루틴 3의 코드 4가 실행된다.
스레드 2에서 코드 3의 실행이 종료되면, 코루틴 1에 있던 코드 2가 스레드 2에서 실행된다.코루틴은 특정 스레드에 종속되지 않고 다른 스레드 배정될 수 있다
Context Swtiching (문맥교환)
하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해,
이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업.
한 프로세스의 문맥은 그 프로세스의 PCB(Process Control Block)에 저장되어 있다.
문맥교환 시 오버헤드가 필연적으로 발생한다.
오버헤드란 처리를 위해 들어간 시간과 메모리 등의 비용을 말하며, 오버헤드가
이러한 문맥교환에서도 프로세스와 스레드, 코루틴과 차이가 존재한다.
프로세스 1이 실행되다 문맥교환이 일어나면 프로세스 2의 메모리로 교체해야 한다. 모든 메모리가 교체되는 작업이므로 비용이 많이 발생한다.
스레드 1의 코드 1이 실행되고 있다.
OS가 스레드 1의 실행을 멈추고 스레드 2의 코드3을 실행한다. 이때 스택 영역의 교체만 일어나게 되며, 프로세스의 교체보다는 비용이 적게 들게 된다.
코루틴 1의 코드 1이 스레드 1에서 실행 중이다.
코드 1의 실행이 중단되면 자리를 양보하고 코드 3를 실행한다.동시성 프로그래밍은 쉽게 한 번에 한 가지 일만 할 수 있지만 아주 빠르게 작업이 전환되어 동시에 하는 것처럼 보이는 것이다.
스레드는 OS가 CPU 상태에 따라 스레드 작업을 스케줄링 한다. 이때 스레드 교체 시 위에서 설명한 것처럼 Context Switching 비용이 발생한다.
그러나 코루틴은 하나의 스레드 내 여러 코루틴을 통해 중단 및 재개하므로 Context Switching 비용으로 인한 오버헤드 없이 언어 수준에서 스케줄링이 가능하다.
메인 스레드를 차단하지 않으며, 현재 코루틴의 실행을 제어할 수 있는 기능을 제공하기에 경량 스레드라고도 부른다
비선점이란 프로세스 자원을 할당 받았을 경우, 자원을 스스로 반납할 때까지 계속 그 자원을 사용하도록 허용하는 정책이다.
하나의 프로세스가 CPU를 할당받으면 종료 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없다.
코루틴은 스스로가 양보하기 전까진 다른 코루틴이 강제로 차지할 수 없다. 이것을 통해 개발자가 직접 작업을 스케줄링 가능하며, 병행성(동시성)을 갖기에 스레드와 메모리 사용량이 줄어든다.
코루틴을 공부하기 전 프로세스, 스레드에 대한 개념을 흐릿하게 알고 있었다.
나 말고도 프로세스와 스레드를 어려워했던 사람이 있을 것이다.
프로그래밍에서 프로세스와 스레드에 대한 중요성과 코루틴에 대해 공부한 내용을 공유하여 조금이나마 다른 사람에게 도움을 주기 위해 이 포스트를 작성하였다.
이 글을 보고 코루틴에 흥미와 관심이 생겼으면 좋겠다!
참고