-
[코루틴] 코루틴(Coroutine) 이란Android 2021. 8. 22. 11:16728x90
코루틴은 1) 특정 위치에서 실행을 일시 중단하고 다시 시작할 수 있는 여러 진입점을 허용하여
2) 비선점 멀티 태스킹을 위해 서브루틴을 일반화하는 프로그램의 구성 요소루틴
하나의 Task, 함수 정도로 생각하면 된다
- 메인루틴
프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어진다.
- 서브루틴
메인 쓰레드가 서브루틴에 진입하면, 맨 윗줄부터 실행이 될것이고 그 아래 코드들을 쭉쭉 실행해서 return문을 만나면 서브루틴을 호출했던 부분으로 탈출한다. 그리고 진입점과 탈출점 사이에 쓰레드는 블락된다
- 코루틴
진입할 수 있는 진입점도 여러개고, 함수를 빠져나갈 수 있는 탈출점도 여러개
코루틴은 쓰레드다 (X) 코루틴은 Object이다 (O)
코루틴과 쓰레드
Thread, Coroutine 모두 Concurrency 동시성 (Interleaving) 를 보장하기 위한 기술입니다
* 싱글 코어 기준 설명
Thread (쓰레드)
※ 쓰레드 : 2021.08.26 - [운영체제] - 프로세스와 스레드
- Task 단위 = Thread
- 다수의 작업 각각에 Thread 를 할당합니다.
각 Thread 는 자체 Stack 메모리 영역을 가지며 JVM Stack 영역을 차지합니다.
- 다수의 작업 각각에 Thread 를 할당합니다.
- Context Switching
- OS에 의한 Context Switching 을 통해 Concurrency 를 보장합니다.
- 선점형 멀티태스킹이며, 멀티코어에서 병렬성 (Parallelism) 제공 - 실제로 동시에 작업이 처리됨.
Coroutine (코루틴)
- Task 단위 = Object (Coroutine)
- 다수의 작업 각각에 Object 를 할당합니다. 이 Coroutine Object는 객체를 담는 JVM Heap 영역에 적재됩니다.
- Programmer Switching = No Context Switching
- 프로그래머의 코딩을 통해 Switching 시점을 마음대로 정함으로써 Concurrency 를 보장
- Suspend (Non-Blocking): 작업 1(Object) 이 작업 2(Object) 의 결과가 나오기까지 기다려야한다면 작업 1 Object 는 Suspend 되지만 작업 1 을 수행하던 Thread 는 그대로 유효하기 때문에 작업 2 도 작업 1 과 동일한 Thread 에서 실행될 수 있음.
- 한 Thread 에 다수의 Coroutine 을 수행할 수 있음과 Context Switching 이 필요없기 때문에 Coroutine 을 Lightweight Thread 로도 부릅니다.
- 비선점형 멀티태스킹이며, 동시성 (Concurrency) 을 제공하지만 병렬성은 제공하지 않음.
Coroutine 은 Thread 의 대안이 아니라 기존의 Thread 를 더 잘게 쪼개어 사용하기 위한 개념이다.
하나의 Thread 가 다수의 코루틴을 수행할 수 있기 때문에 더 이상 작업의 수만큼 Thread 를 양산하며 메모리를 소비할 필요가 없다※ 선점형 vs 비선점형 : 2021.08.27 - [운영체제] - [운영체제] CPU 스케줄링
참고
- https://wooooooak.github.io/kotlin/2019/08/25/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0/
- https://medium.com/@sunminlee89/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4-coroutine-%EA%B8%B0%EC%B4%88-1342ae6916ce
- https://www.slideshare.net/QooJuice/coroutine-119750550
- https://aaronryu.github.io/2019/05/27/coroutine-and-thread/
728x90'Android' 카테고리의 다른 글
[Android] MVC vs MVP vs MVVM (0) 2021.08.29 [Android] Android HTTP 통신 (Retrofit, HttpUrlConnection) (0) 2021.08.28 [Android] RxJava (0) 2021.08.28 [코루틴] 코틀린(Kotlin)의 코루틴(Coroutine) (0) 2021.08.27 Android Developer Roadmaps 2020 (0) 2020.12.05 - Task 단위 = Thread