-
[ 코틀린 ] 코루틴1 : Coroutine 이해하기Android & Kotlin 2022. 2. 2. 15:53
1. 코루틴 이란?
코루틴이란 실행의 지연과 재개를 허용함으로서, 비 선점적 멀티태스킹을 위한 서브루틴을 일반화한 컴퓨터 프로그램 구성요소이다. (위키피디아 참고)
2. 루틴과 코루틴
루틴이란 프로그램을 이루는 일련의 정리된 일로써 프로그램은 이러한 루틴들의 조합으로 이루어진다.
프로시저 , 함수를 포함하는 상위개념이며 , 다시 루틴은 메인 루틴과 서브루틴으로 다시 나뉘게 된다.
- 메인루틴
- 프로그램 전체의 동작을 절차적으로 담고 있는 영역
- 서브루틴
- 반복되는 특정기능들을 작은 단위로 나누어 모아놓은 영역
- 함수 또한 일종의 서브루틴 입니다.
이때 코루틴 또한 루틴의 일종이며 3가지 차이점을 보입니다.
- 메인 - 서브 개념이 없고, 모든 루틴들이 서로를 호출할 수 있다.
- 진입점과 탈출점이 여러 개여서 꼭 return을 만나지 않더라도 언제든지 서브루틴 실행 도중에 나갈 수 있고, 다시 나갔던 지점으로 돌아올 수도 있다.
- 서브루틴은 진입점과 탈출점이 단 하나밖에 없어서 메인 루틴에 종속적이지만 코루틴은 진입지점이 여러 개여서 메인 루틴에 종속적이지 않고 대등하게 데이터를 주고 받을 수 있다.
서브루틴 및 함수 & 코루틴 3. 코루틴의 동작원리 ( 코루틴 vs 쓰레드 )
- 공통점 : 둘다 비동기 작업을 수행할 때 사용할 수 있습니다. 동시성(Concurrency) 를 보장합니다.
- 차이점 : 쓰레드는 OS 단위에서 ContextSwitching 이 일어나고 코루틴은 기본적으로 한개의 스레드에서 Object 단위로 전환이 발생합니다.
프로세스 보다는 덜 하지만 Thread 또한 ContextSwitching 으로 인해 많은 비용이 발생하고 이에 반해 코루틴은 테스크 전환에 있어서 더 적은 비용이 발생합니다. 그리고 추가적으로 스레드 보다 더욱 쉽게 이용할 수 있다는 장점이 있습니다.
Thread
Thread는 하나의 프로세스 안에서 힙을 공유하지만 각각의 스텍을 메모리를 가지고 있습니다. 따라서 테스크 전환이 Thread 단위 즉 OS 커널에 의한 ContextSwitching 으로 일어 나게 됩니다.
Coroutine
코루틴은 하나의 스레드 안에서 여러 작업들을 각각 Object 로 JVM heap 에 할당합니다. 따라서 테스크 전환은 Thread 내부 단위로서 더 적은 비용의 전환인 사용자에 의한 전환이 가능해집니다.
위의 Thread는 작업1 에서 작업2의 응답을 필요하는 상황에서는 작업1은 ContextSwitching 에 의해 blocking 상태가 됩니다. 반면 Coroutine 은 ContextSwitching이 발생하지 않기때눈에 단순히 Suspend(Non-Blocking)로 작업을 보류시켜놓을 수 있습니다.
출처 :
1. https://aaronryu.github.io/2019/05/27/coroutine-and-thread/
'Android & Kotlin' 카테고리의 다른 글
[ Android ] startActivityForResult deprecated 이유와 대안( Activity Result API) (0) 2022.02.15 [ 코틀린 ] 코루틴2 : Coroutine 사용하기 - 기초 (0) 2022.02.02 함수형 프로그래밍 with Kotlin (0) 2022.01.20 Thread 에서 UI 접근 (0) 2021.06.14 [안드로이드] volly 로 안드로이드와 서버의 연결(get ,post) (0) 2021.05.18 - 메인루틴