캠프에서 제공하는 5주차 강의를 듣고 비동기 프로그래밍에 대해 정리해보겠다.
동기? 비동기?
동기적 프로그래밍이란 작업한 코드가 순서대로 하나의 작업씩 수행하는 것을 뜻한다. 따라서 앞선 작업에 영향을 받아 필요한 작업이 느려질 수 있다. 앞에서 무한루프가 발생한다면 뒤의 작업은 영원히 시작되지 않는다.
비동기 프로그래밍이란 여러 로직이 완료여부에 상관없이 실행되는 방식을 의미한다. 동시에 여러 로직이 실행될 수 있으며 따라서 동기적으로 실행하지 않아도 되는 기능은 비동기적으로 실행하는 것이 좋다.
동기 프로그래밍은 요청을 보내면 결과값을 받을 때까지 작업을 멈추지만 비동기 프로그래밍은 결과값을 받을 때까지 멈추지 않고 다른 작업을 수행한다.
쓰레드
쓰레드를 사용하기 위해서는 외부 종속성을 추가해주어야한다. 스튜티오에 있는 gradle(app)파일에 임플리먼트를 추가하면 사용준비가 끝난다.
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
main 내부에 thread 키워드를 통해 코드블럭을 작성하면 각 쓰레드가 순서가 보장되지 않고 리소스를 두고 경쟁한다.
코루틴(Co - routine)
최적화된 비동기 함수를 사용한다.
하드웨어 자원의 효율적인 할당을 가능하게 한다.
안정적인 동시성, 비동기 프로그래밍을 가능하게 한다.
쓰레드보다 가볍게 사용가능하다.
구글에서 적극적으로 권장하는 방법이다.
코루틴은 빌더와 함께 사용하며 일반적으로 launch와 async를 많이 사용한다.
launch는 결과값이 없는 코루틴 빌더를 의미하며 Job 객체로 코루틴을 관리한다.
Jop객체는
- join : 현재의 코루틴이 종료되기를 기다린다.
- cancle : 현재의 코루틴을 즉시 종료한다.
등 여러 유용한 함수를 가지고있다.
차이점
쓰레드
- 작업 하나의 단위 : Thread
- 동시성 보장수단 : Context Switching
쓰레드는 Thread.를 하나의 작업단위로 가지고있으며 각 Tread가 독립적인 Stack메모리 영역을 가진다.
위에서 설명한 것처럼 Task1 도중에 Task2의 결과값이 필요하면 Task1이 멈추고(Blocking) Task2를 수행한다. 이러한 블로킹 과정 사이에도 다른 쓰레드는 Task를 진행한다.
따라서 이런 쓰레드를 어떤 순서로 실행할 지 Task를 어떻게 쪼갤지가 중요한데 이것을 결정하는 행위를 스케쥴링이라고 한다. 이러한 스케쥴링은 운영체제가 수행하며 이런 스케줄링 등을 통해 동시성을 보장한다.
코루틴
- 작업 하나의 단위 : Corutine Object
- 동시성 보장수단 : Programmer Switcing(No - Context Switching)
여러 작업 각각에 object를 할당하고 이러한 코루틴 오브젝트들 또한 객체이므로 JVM Heap에 적재한다.
스위칭을 코드를 통해 프로그래머가 제어한다.(OS는 관여하지 않는다.)
Object 1이 Object 2의 결과를 기다릴 때 Object1의 상태는 Suspend로 바뀐다.(Thread는 멈추지 않고 유효하다.) 그래서 Object 2도 해당 Thread에서 실행된다.
'TIL > 공부' 카테고리의 다른 글
03/18 안드로이드 스튜디오 Empty View Activity (1) | 2024.03.18 |
---|---|
03/14 Activity Intent Flag, Task (1) | 2024.03.14 |
03/07 코틀린 생명주기 (0) | 2024.03.07 |
03/06 코틀린 Context (0) | 2024.03.07 |
03/04 코틀린 Regex - 정규 표현식(Regular Expression) (0) | 2024.03.04 |