Kotlin Coroutine 이해하기 1부
안드로이드 컴포즈 모각코에 참여하면서 스터디 그룹에 들어갈 기회가 생겼다.
각 주제별로 나누어 내가 들어간 팀은 5인조로 구성되었고,
처음 만나보는 분들과 정보도 교류하고 학습도 할 수 있는 좋은 기회라고 생각한다.
공통주제로 Kotlin의 Coroutine과 Flow에 대해 포스팅을 작성하고 한 명이 발표하는 것으로 정하였다.
Thread 이해
코루틴을 이해하기 앞서 Java를 사용하며 봐왔던 Thread에 대한 이해가 필요하다.
OS위에서 메모리 공간을 할당받아 실행중인 소프트웨어/프로그램 이를 Process(프로세스)라 한다. 하나의 프로그램은 1개 이상의 프로세스를 실행하고 프로세스 당 1개의 Heap 메모리를 할당받아 한 가지의 작업을 한다.
그리고 프로세스에는 1개 이상의 Thread(스레드)가 Stack 메모리를 할당받아 프로세스 내에서 여러 작업을 동시에 할 수 있게한다.
두 개 이상의 스레드를 가질 경우, Multi threaded process(멀티스레드 프로세스)라고 칭한다.
Thread 구현
Java의 경우 Thread 클래스를 Extend(상속)받아 run() 메소드를 오버라이딩하거나, 다른 클래스 상속을 위해 대부분의 경우 Runnable 인터페이스를 구현한다.
Thread Pool 에 의해 관리되는 Thread
이 부분은 Thread와 Coroutine의 동작의 차이점을 설명하기 위해 이해가 필요하다.
위와 같이 코드를 동작하면 동시에 여러 작업이 수행되는 것 처럼 보인다.
즉, 위에서 여러 동작을 동시에 처리한다는 것은 하드웨어 관점이며 소프트웨어의 스레드는 동시에 처리하는 것 처럼 보이게한다.
이는 자바에서 스레드를 무한하게 실행할 수 있는 것을 보면 알 수 있다. 물리적 코어의 수는 한정적이며 스레드도 마찬가지이다.
하드웨어적 스레드는 Parallelism(병렬성)을 갖고, 소프트웨어적 스레드는 Concurrency(동시성)을 갖는다.
Parallelism: 동시에 각 Task들이 수행
Concurrency: 각 Task를 조금씩 나누어서 번갈아 가면서 수행
운영체제는 스레드 단위로 CPU 자원을 Scheduling(스케줄링)하여 실행하는데, 스케줄러에 의해 스레드의 작업이 일시중단하면 PCB(Process Control Block)에 보관하고 다시 꺼내는 과정을 반복한다.
만약 엄청난 양의 스레드를 동시에 돌린다면 메모리 증가와 함께 위와 같은 Context Switching(컨텍스트 스위칭)에 따른 퍼포먼스 저하 그리고, 예상치 못한 데드락과 같은 비동기 이슈가 발생할 수도 있다.
따라서 Java에서는 새로운 작업이 들어올 떄마다 Task Queue에 보관하였다가 여유 스레드가 있을 때, 작업을 할당해주는 Thread Pool(스레드 풀)을 사용한다.
아래는 자바에서의 사용 예제이다.
- 참조
ⓒ 굿햄 2022. daryeou@gmail.com all rights reserved.
'Kotlin&Java > Coroutine' 카테고리의 다른 글
[Kotlin] 안드로이드에서 Coroutine 사용하기 (2) | 2023.01.18 |
---|---|
[Kotlin] Coroutine vs Thread (0) | 2023.01.18 |
댓글