본문 바로가기
Android.Study

<Android> ★비동기 프로그래밍: 쓰레드&코루틴★

by 도슬 2023. 7. 18.

: 여러가지 로직들이 완료 여부에 관계없이 실행되는 방식, 즉 다양한 작업을 동시처리할 수 있다.

 

★쓰레드★
1. 각 쓰레드가 독립적인 Stack메모리 영역을 가진다.
2. ThreadA가 ThreadB의 결과를 기다리고있을때 ThreadA는 블로킹 상태인데
3. ThreadB의 결과가 나올떄까지 해당 자원을 사용할 수 없다.
예)
1.Thread A가 Task1을 수행하는동안 Task2의 결과가 필요하면 ThreadB를 호출한다.
2. 이때 ThreadA는 블로킹이되고 ThreadB로 프로세스간에 스위칭이 일어나 Task2를수행
3. Task2가 완료되면 ThreadA로 다시 스위칭해서 결과값을 Task1에게 반환
4. 이때 Task3, Task4는 A,B작업이 진행되는 도중 멈추지않고 각각 동시에실행
5. 이때 운영체제 입장에서 각 Task를 쪼개서 얼마나 수행할지가 중요하다.
6. 그래서 어떤 쓰레드를 먼저 실행해야할지 결정하는행위를 스케쥴링이라고한다.
7. 이러한 행위를 통해 동시성을 보장한다.

★코루틴★
1.작업 하나하나의 단위 : Coroutine Object
a. 여러 작업 각각에 Object를 할당한다.
b. Coroutine Object도 엄연한 객체이기 때문에 JVM Heap에 적재(코틀린기준)
//객체를 만들면 특정메모리에 적재하는거처럼 똑같이 하는데 이때 메모리가 Heap
2. 동시성 보장수단 : Programmer Switching(No-COntext Switching)
a. 소스를 통해 Switching 시점을 마음대로 정한다(OS는 관여X)
b. Suspend(Non-Blocking)
- Object1이 Object2의 결과를 기다릴떄 Object1의 상태는 Suspend로 바뀐다.
- 그래도 Object1을 수행하던 Thread는 그대로 유효하다(쓰레드처럼 블로킹이안됨)
- 그래서 Object2도 Object1과 동일한 Thread에서 실행된다.
예)
1. 코루틴은 작업단위가 Object이다.
2. Task1을 수행하다가 Task2의 수행요청이 발생했을때
3. 컨텍스트 스위칭없이 동일한 ThreadA에서 수행가능(쓰레드는 블로킹되어 결과값을 기다려야됨)
4. Thread C처럼 하나의 쓰레드에서 여러 Task Object들을 동시수행가능
5. 이런 특징때문에 코루틴을 Light-Weight Thread라고 한다.
-동시처리를 위해 스택영역을 별도로 할당하는 쓰레드처럼 동작X
-근데도 동시성을 보장한다.
-즉, 하나의 쓰레드에서 다수의 코루틴을 수행할 수 있다.
-커널의 스케쥴링을 따르는 컨텍스트 스위칭을 수행하지 않는다.

>>>쓰레드 & 코루틴
1. 쓰레드나 코루틴은 각자의 방법으로 동시성보장하는 기술이다.
2. 코루틴은 쓰레드를 대체하는 기술이아니다.(서로 다른기술이다.)
3. 하나의 쓰레드를 더욱 잘개 쪼개서 사용하는 기술이다.
4. 코루틴은 쓰레드보다 CPU자원을 절약하기때문에 Light-Weight Thread라고한다.
5. 구글에서는 코틀린의 코루틴 사용을 적극 권장한다.

'Android.Study' 카테고리의 다른 글

<Android> 자기자신의 객체전달  (0) 2023.07.18
<Android> 복수 데이터 리턴& 확장함수  (0) 2023.07.18
<Android>자료형의 변환  (0) 2023.07.18
<Android> ★싱글턴★  (0) 2023.07.17
<Android>널 세이프티& 컬렉션  (0) 2023.07.17