안드로이드 개발자의 창고
[Android] Coroutine과 Thread의 차이 본문
📖 Process & Thread
- Process : 프로그램이 메모리에 적재되어 실행되는 인스턴스(객체)
- Thread : Process 내에서 실행되는 실행 단위
- 각 작업에 해당하는 메모리 영역을 할당
- OS 레벨에서 각 작업들을 얼만큼씩 분배하여 수행해야지 효율적일지 선점 스케줄링(Preempting Scheduling)을 필요로 함
- Task 단위 = Thread
- 다수의 작업 각각에 Thread를 할당한다.
각 Thread는 자체 Stack 메모리 영역을 가지며 JVM Stack 영역을 차지한다.
- 다수의 작업 각각에 Thread를 할당한다.
- Context Switching
- OS Kernel에 의한 Context Switching을 통해 동시성을 보장한다.
- Blocking:
- Thread A가 Thread B의 결과가 나오기까지 기다려야한다면
- Thread A는 Blocking 되어 그 시간동안 해당 자원을 사용하지 못한다.
📖 Coroutine
- 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴
- Lightweight Thread 라고 불림
- 작업을 효율적으로 분배하여 조금씩 수행하여 완수하는 동시성(Concurrency)을 목표로 함
- 각 작업에 대해 Thread를 할당하는 것이 아니라 작은 Object만을 할당해주고 이 Object들을 자유자재로 스위칭함으로써 Switching 비용을 최대한 줄임
- Task 단위 = Object (Coroutine)
- 다수의 작업 각각에 Object를 할당한다.
이 Coroutine Object는 객체를 담는 JVM Heap에 적재된다.
- 다수의 작업 각각에 Object를 할당한다.
- Programmer Switching = No Context Switching
- 프로그래머의 코딩을 통해 Switching 시점을 마음대로 정함으로써 동시성을 보장한다.
- Suspend (Non-Blocking):
- Task 1(Object)이 Task 2(Object)의 결과가 나오기까지 기다려야한다면
- Task 1은 일시 중지(Suspend) 되지만
- Task 1을 수행하던 Thread는 그대로 유효하기 때문에 Task 2도 Task 1과 동일한 Thread에서 실행될 수 있다.
📖 동시성(Concurrency)이란 뭘까?
동시성과 같이 따라오는 단어는 병렬성(Parallelism)이다.
동시성(Concurrency) = Interleaving, 시분할
- 다수의 Task가 있는데, 각 Task들을 평등하게 조금씩 나누어 실행하는 것
- 총 실행시간은 Context Switching에 대한 비용을 제외하곤 각 Task 수행 시간을 합친 것과 동일하다.
- 위의 사진에서는 Task가 각각 10분씩 걸리고 이를 동시성으로 처리하면 총 20분이 걸리는 것이다.
병렬성(Parallelism) = Parallelizing, 병렬 수행
- Task 수 만큼 자원이 필요하며, Context Switching은 필요없다.
- 총 실행 시간은 다수의 Task 중 가장 소요 시간이 긴 Task만큼 걸린다.
- 위 사진에서는 각각의 Task가 10분 씩 소요되므로 총 소요 시간은 10분이다.
📖 Thread와 Coroutine
- Coroutine으로 ‘작업(Task)’의 단위를 Thread가 아닌 Object로 축소하면서, 작업의 전환 및 다수 작업 수행에 굳이 다수의 Thread 를 필요로 하지 않게 된다.
- 하나의 Thread가 다수의 Coroutine을 수행할 수 있기 때문에 더 이상 작업의 수만큼 Thread를 양산하며 메모리를 소비할 필요가 없다.
- 각 Thread마다 갖는 Stack 메모리 영역을 갖지 않기 때문에, Thread 사용 시 Thread 개수만큼 Stack 메모리에 따른 메모리 사용 공간이 증가하지 않아도 된다.
- 같은 프로세스내에 ‘공유 데이터 구조’(Heap)에 대한 locking 걱정도 없다.
- 즉, Coroutine 이 수행될 Thread 도 프로그래머가 Shared Thread Pool 을 지정하여 결정한다는 의미이며, Coroutine을 활용한 효율성은 오로지 프로그래머의 몫이라는 의미이다.
'Computer > Android' 카테고리의 다른 글
[Android] MVC / MVP / MVVM 차이 (0) | 2023.09.02 |
---|---|
[Android] MVVM (0) | 2023.08.24 |
[52일차 Android] Socket 통신 (0) | 2023.07.27 |
[52일차 Android] 앨범에서 사진 가져오기 (0) | 2023.07.24 |
[52일차 Android] 사진 촬영하기 (0) | 2023.07.24 |