본문 바로가기
공부/코틀린코루틴:딥다이브(마르친 모스카와)

4장 - 코루틴의 실제 구현

by 띵커베르 2024. 1. 14.
728x90
  • 중단 함수는 함수가 시작할 때와 중단 함수가 호출되었을 때 상태를 가진다는 점에서 상태 머신과 비슷합니다.
    • 상태머신: 코루틴의 실행 과정은 내부적으로 상태 머신으로 변환됩니다.코루틴은 여러 상태(예: 시작, 중단, 재개, 완료)를 가질 수 있으며, 이러한 상태는 코루틴의 생명주기를 관리 한다.
  • 컨티뉴에이션 객체는 상태를 나타내는 숫자와 로컬 데이터를 가지고 있다.
  • 함수의 컨티뉴에이션 객체가 이 함수를 부르는 다른 함수의 컨티뉴에이션 객체를 장식합니다. 그 결과, 모든 컨티뉴에이션 객체는 실행을 재개하거나 재개된 함수를 완료할 때 사용되는 콜 스택으로 사용됩니다.

 

  • 컨디뉴에이션 전달 방식
    • 중단 함수가 구현될 수 있는 수많은 방법 중에서 코틀린 팀은 컨티뉴에이션 전달  방식을 택함.
    • 컨티뉴에이션은 코루틴이 중단된 지점의 정보를 담고 있다.
      • 현재의 로컬 변수 값, 중단된 위치, 코루틴이 다시 시작될 때 필요한 다른 정보들이 포함됨
    • 1.중단 함수 호출: 
      • 코루틴 내에서 suspend 키워드가 붙은 중단 함수를 호출하면 코루틴은 해당 지점에서 실행을 중단하고, 중단 함수는 컨티뉴에이션을 매개변수로 받는다
    • 2.컨티뉴에이션 객체 생성 및 저장
      • 코루틴이 중단될 때, 현재의 실행 상태는 컨티뉴에이션 객체에 저장된다. 이 객체는 코루틴의 상태 및 중단된 위치의 정보를 포함하고 있다.
    • 3.컨티뉴에이션을 통한 재개
      • 비동기 작업이 완료되면, 컨티뉴에이션을 통해 코루틴을 다시 시작할 수 있다.
      • resume 또는 resumeWithException 메서드를 사용하여 코루틴을 재개한다.
    • lable
      • 코루틴에서 중단과 재개 시 사용되는 lable 은 코루틴이 중단된 지점을 식별하는 데 사용되는 내부 메커니즘.
    • 기타
      • 컨티뉴에이션은 한번만 재개될 수 있다 한번 resume 또는 resumeWithException 을 호출하면 같은 컨티뉴에이션을 다시 사용할 수 없다
  • 콜 스택
    • 전통적인 스레드에서는 각 스레드가 자신의 콜 스택을 가지고 있다.이 콜 스택에서는 함슈 호출의 기록, 로컬 변수, 반환 주소 등이 저장된다.
    • 코루틴은 전통적인 스레드와는 다르다.
      • 코루틴에서는 콜 스택이 가상화 된다.
      • 즉 코루틴이 중단되었다가 재개될 때, 기존의 콜 스택 상태를 복원하고 관리하는 방식의 스레드의 콜 스택과는 다르다.
      • 코루틴은 중단 가능한 지점에서 실행 상태(콜 스택의 정보)를 저장하고, 나중에 이상태를 다시 불러와서 코루틴을 재개한다.
  • 코루틴의 콜 스택 관리
    • 상태저장
      • 코루틴은 suspend 함수를 만나 중단될 때, 현재의 콜 스택상태(함수 호출 정보, 로컬 변수 등)는 컨티뉴에이션 객체 내에 저장된다.
    • 상태 복원 및 재개
      • 코루틴이 재개될 때, 이전의 저장된 콜 스택 상태가 복원된다.이를 통해 코루틴은 중단되었던 지점부터 실행을 계속할 수 있다.
    • 코루틴의 콜 스택과 성능
      • 코루틴은 이러한 콜 스택 관리 방식은 여러 면에서 성능 이점을 제공
        • 가벼움: 전통적인 스레드 보다 가벼우며, 많은 수의 코루틴을 동시에 실행할 수 있다.이는 코루틴의 콜 스택이 더 적은 메모리를 사용하기 때문
        • 유연성: 코루틴은 콜 스택의 상태를 자유롭게 저장하고 복원할 수 있어, 비동기 작업을 더 유연하게 처리할 수 있다.
        • 비동기 최적화: 코루틴은 비동기 작업에서 스레드를 차단하지 않는다. 이는 콜 스택의 상태를 저장하고 복원하는 능력 덕분에 가능하다.
    • 전통적인 스레드?코루틴은 다르다?
      • 전통적인 스레드의 콜 스택
        • 고정된 스택 크기:고정된 스택의 크기를 가지고 있으며, 이 스택에는 함수 호출 기록, 로컬 변수, 반환 주소 등이 저장됨
        • 운영체제 관리: 스레드의 콜 스택은 운영체제에 의해 관리된다.스레드가 실행될 때, 운영체제는 이 스레드에 대한 콜 스택을 할당하고 관리함.
        • 블로킹 작업: 스레드가 대기상태(ex:I/O 작업대기)에 들어가면, 해당 스레드의 콜 스택은 그 상태로 유지된다. 이는 스레드가 자원을 계속 점유하고 있음을 의미
      • 코루틴의 콜 스택
        • 가상의 콜 스택: 코루틴은 가상의 콜 스택을 사용한다.이는 코루틴이 중단되었을 때 현재의 실행상태를 외부에 저장하고, 재개될 때 다시 불러올 수 있음을 의미한다.
        • 컨티뉴에이션을 통한 관리: 코루틴의 콜 스택 상태는 컨티뉴에이션 객체에 저장된다.코루틴이 중단되면, 현재의 콜 스택상태(함수 호출, 로컬변수 등)는 컨티뉴에이션에 저장되고, 코루틴이 재개될때 이 상태가 다시 복원됨
        • 비동기 작업 최적화: 비동기 작업을 기다리는 동안 스레드를 차단하지 않는다.대신 콜스택 상태를 저장하고 스레드를 다른 작업에 활용할 수 있다.
      • 그래서 핵심은?
        • 메모리사용: 코루틴은 전통적인 스레드보다 훨씬 적은 메모리를 사용한다.코루틴이 실행 상태를 필요에 따라 저장하고 복원하기 때문이다
        • 비동기 처리: 코루틴은 비동기 처리에 최적화되어 있다.중단과 재개가 가능하므로, I/O 작업과 같은 블로킹 작업에 스레드를 낭비하지 않는다.
        • 효율적인 자원 관리: 코루틴은 자원을 보다 효율적으로 관리할 수 있다.하나의 스레드에서 여러 코루틴을 실행할 수 있으며 이는 컨텍스트 스위칭 비용을 줄여준다.
      • 기타
        • 코루틴이 중단될 때, 현재의 실행상태는 컨티뉴에이션 객체에 저장되는데 컨티뉴에이션은 힙 메모리에 저장되며, 재개될 때 이 객체를 통해 실행 상태가 복원된다. 이는 코루틴이 실제 물리적인 스택 메모리를 연속적으로 사용하지 않음을 의미한다.
        • 코루틴은 실행 중일 때 물리적인 스택을 사용하고, 중단과 재개를 수행할 때는 컨티뉴에이션(즉, 힙 메모리)을 사용한다
        • 왜 가상의 스택 이라는 용어를..?
          • 전통적인 스택과의 차별화: 일반적인 스레드는 물리적 스택 메모리를 연속적으로 사용하지만, 코루틴은 중단과 재개가 가능하며 이 과정에서 실행 상태는 힙 메모리에 위치하는 컨티뉴에이션 객체에 저장.이러한 차이점을 강조하기 위헤 가상의 라는 용어를 사용
728x90

댓글