Antilog의 개발로 쓰다
반응형

Coroutine 이 뭘까?

주로 Coroutine 을 설명하면 Coroutine 은 루틴의 일종으로 “Co(협력하다)” + “routine” 이며 실행의 지연과 재개를 허용하여 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 구성요소라고 한다.

사실 이 말로는 Coroutine을 이해하기에 매우 어렵기에 하나하나 뜯어보고자 한다.

Routine 이란?

우리가 만드는 프로그램은 Main Routine 과 Sub Routine 으로 나뉘게 된다.

말이 어렵지만, 쉽게 보면 다음과 같다.

 fun main() {
     // Main routine 은 main 함수라고 볼 수 있다. (프로그램이 시작되는 그 main 함수)
     // main 함수로 인해 실행되는 흐름을 이야기 한다.
     // ...
     val result = add(1 + 2)
     // ...
 }

 fun add(a: Int, b:Int) {
     // Sub routine 은 main 함수 안에서 실행되는 개별 함수로 볼 수 있다.
     // main 함수 안에서 실행되는 함수의 흐름을 이야기 한다.
     return a+b
 }

쉽게 정리하면 다음과 같다

  • Main Routine : main 함수로 실행되는 흐름
  • Sub Routine : main 함수에서 호출되어 실행되는 흐름

여기서 Sub Routine 에는 진입 지점과 탈출지점이 명확하다는 특징이 있다.

서브 루틴은 호출시 해당 함수의 메모리로 이동하고 실행한 후 return 을 통해서 원래 호출 위치로 돌아오게된다.

혹은 닫는 괄호를 만나는 경우 돌아온다.

단일 진입 지점 에서 시작하고 단일 반환 지점 에서 종료된다.

실행의 지연(suspended) 과 재개(resumed) 를 허용한 Coroutine

Coroutine 은 협력하는 루틴이라는 뜻이며, 실행의 지연과 재개를 허용한 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 구성요소라고 했다.

어려운 말을 빼고 보면 결국 실행의 지연과 재개를 허용한 Sub Routine 이라고 볼 수 있다.

기존의 SubRoutine 이 Main Routine 에서 호출되는 진입 지점과 반환문을 통한 탈출 지점이 단일한 것과 다르게 Coroutine 은 진입 지점과 탈출 지점이 여러개다.

이것은 내부적으로 Continuation Passing Style(CPS) 와 state machine 을 이용하여 동작하는데, 당장 Coroutine 이 무엇인지 알아 보는 단계에선 이로 인해서 진입 지점과 탈출 지점이 여러개가 될 수 있다는 것으로 알고 넘어가면 될 것 같다.

비선점적 멀티태스킹?

이제 남은 단어는 비선점적 멀티태스킹이라는 것만 알게 되면 Coroutine 의 설명을 통해 Coroutine 이 무엇인지 이해할 수 있다.

선점형

어떤 프로세스가 CPU를 할당 받아 실행중에 있어도 
다른 프로세스가 실행중인 프로세스를 중지하고 CPU 를 강제로 점유할 수 있다.

비선점형

어떤 프로세스가 CPU 를 할당 받아 실행중에 있다면
종료되기 전까지 다른 프로세스가 CPU 를 할당 받을 수 없다.

예를 들어서 영화보기, 게임하기, 옷입기와 같은 작업이 있을 때, 비선점형의 환경에서는 영화를 보는 작업이 시작되면 게임하기, 옷 입기와 같은 작업은 영화보기가 종료될 때까지 대기해야한다.

즉 물리적으로 병렬적으로 작업이 실행되지 않는다는 것이다.

하지만 멀티태스킹이라고 한다면, 영화를 보면서 게임도 하고 옷도 입을 수 있어야 한다는 것인데 이런 환경에서 멀티태스킹을 위한 개념이 동시성 프로그래밍일 것 같다.

동시성?
동시성이란 논리적으로 병렬적으로 작업이 실행되는 것 처럼 보이는 것을 말한다.

예를 들면 오른손에만 팬을 들고 2개에 도화지에 그림을 번갈아 가면서 그리면 순서대로 그리는 것이 된다. 하지만 이 행위가 매우 빨라지면 도화지만 본다면 마치 두 종이에 동시에 그림이 그려지는 것 처럼 보이게 된다.

이런 것을 보고 논리적으로 병렬적으로 작업이 실행되는 것 처럼 보인다고 한다.

즉 위 예시에서는 영화를 아주 잠깐 보고, 게임을 아주 잠깐 하고, 옷을 입는 것을 매우 빠르게 반복하면 사실상 영화를 보면서 게임을 하고 옷을 입는 것과 같다.
사실 현실에서 “동시에 일을 처리” 라고 하면 a,b,c 라는 일이 같은 시점에 시작되고 처리되는 것을 말하지만, 프로그래밍에서는 이를 병렬성이라고 부른다.

결론

결과적으로 위 내용을 통해 우리는 Coroutine 을 이해할 수 있다.

비선점형 멀티 테스킹을 위해서 일을 아주 잘게 나누어 논리적으로 병렬적으로 보이게끔 작업을 하기 위해서, 함수를 중단, 재개 할 수 있게 한 것이라고 볼 수 있다.

이것을 이제 어떻게 이용할 수 있는지는 다음부터 알아볼 예정이다.

마무리 하며…

사실 운영체제를 배우고 시간이 지난 시점에서 기억이 안나는 부분이 되게 많아서 정리하는 과정에서 거의 다시 한번 운영체제를 공부한 것 같다.

실제로 처음 coroutine 을 알게 되었을 때 가독성 좋고 쉽게 개발자가 동시성 처리를 할 수 있다는 장점이 있고, 경량 스레드라고 불릴 정도로 Thread 랑 비교하면 매우 가볍다고 들었던 것 같은데 왜 그런지 알기 위해서 다시 보는 과정에서 운영체제를 다시 보게되었다.

사실 개인적으로 첫 공부에서 사용하고 어떻게 잘 활용할지 고민했던 것과 다르게 다시 공부 하며 “Process 나 Thread 나 결국 ContextSwitching 을 위해 처리하는 부분이 있는데 Coroutine 은 어떻게 하는거지?” 라는 의문에서 출발해 내부적으로 Continuation Passing Style(CPS) 와 state machine 을 이용하여 동작하는 것을 알았을 때 매우 흥미로웠던 것 같다.

먼저 이 Coroutine 에 대해서 알아보는 과정을 모두 적고 나면 CPS 와 StateMachine 에 대한 부분도 글로 작성해보고자 한다.

반응형

'Android > Coroutine' 카테고리의 다른 글

[Coroutine] Coroutine 을 알아보기 앞서...  (0) 2025.03.03
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...