Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[Android] Coroutine과 Thread의 차이 본문

Computer/Android

[Android] Coroutine과 Thread의 차이

Wise-99 2023. 9. 4. 18:30
 

Coroutine, Thread 와의 차이와 그 특징

처음 Kotlin 를 사용하던 중에 비동기 처리를 위해 Coroutine 개념을 마주했었습니다. 동기란 요청을 보낸 후 요청에 대한 반환값을 얻기 이전까지 대기하는걸 의미하고, 비동기는 그 대기시간동안

aaronryu.github.io

 

 

 

📖 Process & Thread

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • Process : 프로그램이 메모리에 적재되어 실행되는 인스턴스(객체)
  • Thread : Process 내에서 실행되는 실행 단위
    • 각 작업에 해당하는 메모리 영역을 할당
    • OS 레벨에서 각 작업들을 얼만큼씩 분배하여 수행해야지 효율적일지 선점 스케줄링(Preempting Scheduling)을 필요로 함

 

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • Task 단위 = Thread
    • 다수의 작업 각각에 Thread를 할당한다.
      각 Thread는 자체 Stack 메모리 영역을 가지며 JVM Stack 영역을 차지한다.
  • Context Switching
    • OS Kernel에 의한 Context Switching을 통해 동시성을 보장한다.
    • Blocking:
      • Thread A가 Thread B의 결과가 나오기까지 기다려야한다면
      • Thread A는 Blocking 되어 그 시간동안 해당 자원을 사용하지 못한다.

 

 

📖 Coroutine

  • 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴
  • Lightweight Thread 라고 불림
  • 작업을 효율적으로 분배하여 조금씩 수행하여 완수하는 동시성(Concurrency)을 목표로 함
  • 각 작업에 대해 Thread를 할당하는 것이 아니라 작은 Object만을 할당해주고 이 Object들을 자유자재로 스위칭함으로써 Switching 비용을 최대한 줄임

 

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • Task 단위 = Object (Coroutine)
    • 다수의 작업 각각에 Object를 할당한다.
      이 Coroutine Object는 객체를 담는 JVM Heap에 적재된다.
  • 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, 시분할

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • 다수의 Task가 있는데, 각 Task들을 평등하게 조금씩 나누어 실행하는 것
  • 총 실행시간은 Context Switching에 대한 비용을 제외하곤 각 Task 수행 시간을 합친 것과 동일하다.
  • 위의 사진에서는 Task가 각각 10분씩 걸리고 이를 동시성으로 처리하면 총 20분이 걸리는 것이다.

 

 

 

병렬성(Parallelism) = Parallelizing, 병렬 수행

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • Task 수 만큼 자원이 필요하며, Context Switching은 필요없다.
  • 총 실행 시간은 다수의 Task 중 가장 소요 시간이 긴 Task만큼 걸린다.
  • 위 사진에서는 각각의 Task가 10분 씩 소요되므로 총 소요 시간은 10분이다.

 

 

 

📖 Thread와 Coroutine

출처 : https://aaronryu.github.io/2019/05/27/coroutine-and-thread/

  • 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