
코루틴이란 ?
- 코틀린을 통해 코루틴을 처음 접하시는 분들이 많기에 코루틴이 코틀린 언어에 종속적인 기술이라고 생각하는 분들이 많습니다.
- 그러나 코루틴은 1958년 코루틴 용어가 만들어지고 난 후 어셈블리 프로그램에서부터 적용되었던 개념입니다.
- C#, Javascript, Python, Go와 같은 고급 프로그래밍 언어에서도 지원하고 있으며 Javascript의 async/await 기술을 사용하고 있다면 더욱 친숙하게 코틀린을 느끼실 수도 있습니다.
- 코루틴은 Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 일의 순서를 뜻합니다.
위키피디아에서의 코루틴 정의
실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소
정의 내 비선점적 멀티태스킹과 서브 루틴은 하기와 같은 의미를 가집니다.
비선점적 멀티태스킹 ?
- 비선점형 : 하나의 프로세스가 CPU를 할당받으면 종료되기 전 까지 다른 프로세스가 CPU를 강제로 차지할 수 없습니다.(코루틴)
- 선점형 : 하나의 프로세스가 다른 프로세스 댓니에 프로세서(CPU)를 강제로 차지할 수 있습니다.(쓰레드)
따라서 코루틴은 병행성은 제공하지만, 병렬성은 제공하지 않는다.
병행성(=동시성, Concurrency) : 논리적으로 병렬로 작업이 실행되는 것 처럼 보이는 것
병렬성(Parallelism) : 물리적으로 병렬로 작업이 실행되는 것
선점형으로 비동기 처리 시의 몇가지 문제점
-
코드의 복잡성 : 독립적인 쓰레드 안에서 각 루틴이 동작하기에 동시성을 제어하는 복잡한 코드가 필요하며 이는 코드 흐름 파악을 어렵게 합니다.
-
비용 : 무분별하게 쓰레드를 사용하면 Context switching 리소스 비용으로 프로그램 성능이 저하됩니다.
- 이러한 문제를 해결하기 위해 다양한 방법이 나오는데, 코루틴은 이런 단점을 해결해 주는 언어적 지원 방법이며 비선점적 멀티태스킹을 사용하여 해결하고 있습니다.
- 코루틴은 쓰레드가 아닌 쓰레드 내 동작하는 하나의 작업 단위이며 정의된 다양한 구성요소의 집합인 Context를 오버라이드 하며 실행됩니다.
- 따라서 쓰레드 내 Context switching 없이 여러 코루틴을 실행, 중단, 재개하는 상호작용을 통해 병행성을 갖기에 쓰레드와 메모리 사용이 줄어들고 개발자가 직접 작업을 스케줄링 할 수 있도록 합니다.
서브 루틴이란 ?