코틀린 기본 문법 - 쓰레드와 코루틴

2024. 6. 12. 13:54Kotlin 기본 문법 정리

# 쓰레드와 코루틴의 공통점

- 동시성 프로그래밍을 위한 기술임

  * 동시성 프로그래밍은 컨텍스트 스위칭이 중요한 개념

 

# 쓰레드와 코루틴의 차이점

1) 쓰레드

@작업 하나하나의 단위: Thread 

- 각 쓰레드가 독립적인 Stack 메모리 영역을 가짐

 

@동시성 보장 수단: Context Switching / 운영체제 커널에 의한 Context Switching을 통해 동시성을 보장

 

@블로킹(Blocking): 쓰레드 A가 쓰레드 B의 결과를 기다리고 있는 경우, 쓰레드 A는 블로킹 상태로 쓰레드 B의 결과가 나

  올 때까지 해당 자원을 사용 불가

   *예시)

  (1) 쓰레드 A가 태스크 1을 수행하는 동안 태스크 2의 결과가 필요하면 쓰레드 B를 호출

  (2) 그동안 쓰레드 A는 블로킹되고, 쓰레드 B로 프로세스가 스위칭되어 태스크 2를 수행

  (3) 태스크2가 완료되면 쓰레드 A로 다시 스위칭해 태스크 2의 결과를 태스크 1에게 반환

  (4) 이때 태스크 3, 4는 A,B 작업이 진행됨과 동시에 각각 진행

  (5) 쓰레드는 이러한 행위를 통해 동시성 보장

     * 스케쥴링: 어떤 쓰레드를 먼저 실행할지 결정하는 행위

 

2) 코루틴

@작업 하나하나의 단위: Coroutine Object

- 여러 작업 각각에 Object를 할당

- Coroutine Object도 엄연한 객체이기 때문에, JVM Heap에 적재함(코틀린 기준)

 

@동시성 보장 수단: Programmer Switching(No-Context Switching)

- 개발자가 소스 코드를 통해 Switching 시점을 마음대로 정함(OS가 관여 X)

 

@서스펜드(Suspend, Non-Blocking)

- object 1이 object 2의 결과를 기다릴 때 object 1의 상태는 서스펜드로 바뀜

- 그래도 object 1을 수행하던 쓰레드는 그대로 유효함

- object 2도 object 1과 같은 쓰레드에서 실행됨

- 태스크 1을 수행하다가 태스크 2의 수행요청이 발생했을 경우, 컨텐스트 스위칭 없이 동일 쓰레드에서 수행 가능

- 쓰레드 C처럼 하나의 쓰레드에서 여러 태스크를 동시 수행 가능

- 이러한 특징 때문에 코루틴을 Light-Weight Thread라고 부름

 

# 요약

- 쓰레드나 코루틴은 각자의 방법으로 동시성을 보장하는 기술

- 코루틴은 Thread를 대체하는 기술이 아니고, 하나의 Thread를 잘게 쪼개서 사용하는 기술

- 코루틴은 쓰레드보다 CPU 자원을 절약

- 구글에서는 코루틴 사용을 적극 권장함