-
[Kotlin] Loom 에 대해 (Room 아님)안드로이드 2023. 4. 16. 23:43
최근 있었던 KotlinConf 발표 주제 중 Loom 이라는 키워드가 있어 Room 오타인가? 하고 관련 내용을 찾아보게 되었다.
그런데 한 번 보고 나니 꽤 쓸모있어 보이는 기술같아 정리해보게 되었다.
그래서 Loom 이 뭐에요
일단 이 Loom 을 한마디로 정의하자면 경량 쓰레드 모델을 이용한 프로그래밍을 지원하는 프로젝트인데,
기본적으로 우리는 작업의 최소 단위를 쓰레드로 알고 있다.
그리고 우린 쓰레드를 네트워크 작업 등의 시간이 오래 걸리거나 응답을 받지 못할 수 있는 작업을 진행하는데 사용하며 프로세스 자체의 진행 흐름을 방해하지 않기 위해 사용한다.
그런데 이 쓰레드를 많이 생성하게 되면 치명적인 문제가 있는데, 그건 바로 컨텍스트 스위칭 (문맥 교환) 과정에서 많은 시간이 소요된다는 것이다.
이 컨텍스트 스위칭이 뭐냐,
기본적으로 우리가 쓰레드를 생성할 때는 앞에서 설명한 것처럼 다른 작업을 동시에 수행하기 위해 생성하는 것인데, 예를 들어 A 쓰레드와 B 쓰레드가 있다고 가정해보자.
A 쓰레드가 실행중이다가 중지되고 B 쓰레드가 실행될 때, A 쓰레드의 현재 상태를 메모리에 저장하고 B 쓰레드의 상태를 불러와 실행하는 작업이 이루어진다.
이 작업을 컨텍스트 스위칭이라 한다.
그리고 저장되는 쓰레드에 대한 정보를 TCB 라 하는데, TCB 에는 다음과 같은 정보들이 저장되어 있다.
- 쓰레드 구분 식별자
- 쓰레드별 고유한 Stack pointer
- 현재 instruction (명령어) 의 주소
- 쓰레드 상태 (running, ready, waiting, start, done)
- 쓰레드 레지스터 값
- 쓰레드가 소속된 processor의 PCB주소
물론 프로세스보다 쓰레드 간의 컨텍스트 스위칭 비용이 훨씬 적게 발생하긴 한다. 쓰레드는 기본적으로 부모 프로세스의 값을 공유하기 때문에 더 적은 내용을 저장하고 불러와도 되기 때문이다.
하지만 어찌됐든 어느정도의 공간(200kb 정도라는 말이 있다) 을 차지하게 되어 다수의 쓰레드를 생성해 관리하는데는 부담이 있는 것이 사실이다.
Loom 프로젝트는 이러한 일반적인 쓰레드 (커널 쓰레드라 한다) 가 아닌 JVM(가상머신) 위에서 실행되고 관리되는 경량 쓰레드 (Fiber: 화이버 라 부르기도 한다. 이하 화이버) 를 사용할 수 있게 하는 프로젝트이다.
이 화이버는 OS가 아닌 JVM 에서 직접 관리해 TCB 크기가 기존 커널쓰레드 대비 1/7 ~ 1/10 수준이라고 한다.
이러다 보니 자연스럽게 컨텍스트 스위칭 과정에서 발생하는 비용이 훨씬 줄어드는 것이다.
화이버를 사용했을 때의 또 다른 이점이 있는데, 바로 스케줄링을 직접 관리할 수 있다는 점이다.
커널 쓰레드를 이용할 때는 이 쓰레드의 스케줄링을 직접 할 수 없고 OS 레벨에서 이루어져 만약 OS 에서 다른 중요한 작업이 있어 내가 사용중이던 쓰레드의 우선순위를 조정한다면 꼼짝없이 기존에 진행되던 작업을 중지하고 우선순위가 뒤로 밀리게 될 수 있다.
하지만 이 화이버는 OS 가 아닌 JVM 레벨에서 관리되기 때문에 스케줄링 작업도 직접 커스터마이징 할 수 있게 된다.
그래서 Loom 은 어떻게 쓸 수 있는데요
Loom 은 JDK 19 에서 새로 등장한 기술로, 프로젝트의 JDK 버전을 19 이상으로 올리고 코루틴 호출시 아래 예시 코드와 같이 Dispatchers.LOOM 키워드를 이용해 실제 사용할 수 있다.
CoroutineScope(Dispatchers.LOOM).launch { // Loom 내부에서 하고싶은일 }
이 글에서 코루틴과 Dispatchers 에 대해까지 설명하기에는 너무 길어질 것 같아 따로 잘 정리된 글이 있어 해당 내용은 이 글을 참고해보면 좋을 것 같다.
[Coroutine] 3. Coroutine의 Dispatcher 란 무엇인가?
Coroutine을 공부하면서 Dispatcher에 대해 상세히 설명된 글이 없어서 이 글을 작성하게 되었다. 많은 사람들에게 도움이 되길 바란다. Dispatcher 코루틴을 시작하게 되면, Dispatcher란 단어를 가장 먼저
kotlinworld.com
짧게 설명하자면 코루틴은 코틀린에서 쓰레드에 전달하기 위한 최소 작업 단위이고, Dispatchers 는 이 작업을 본인(Dispatchers) 이 관리하고 있는 쓰레드풀 중에 쉬고 있는 쓰레드에 작업을 할당해주는 작업반장 같은 역할이다.
그래서 저 Dispatchers.LOOM 키워드를 이용하면 커널 쓰레드가 아닌 화이버를 쉽게 이용할 수 있다는 사실
재밌네요
이 Loom 프로젝트의 등장으로 인해 리액티브(Rx) 프로그래밍의 시대가 끝났다고 말하는 사람들도 있다.
기존에 리액티브 프로그래밍으로 개발된 코드의 가독성이 너무 떨어졌을 뿐더러 속도 자체도 코루틴이 더 빠르다는 평이 있었는데, 그보다 더 빠르고 가볍게 코루틴을 이용할 수 있는 기술이 생겨서 그런 것 같다.
'안드로이드' 카테고리의 다른 글
Kotlin Coroutine (코루틴) 내부 동작원리 (2) 2024.03.26 Object 와 Companion Object 의 차이점에 대해 (0) 2023.04.09 sealed class 란? (0) 2023.04.02 [Jetpack Compose] 스낵바 표시, MutableState 사용기법에 대해 (0) 2023.03.18 Firebase Crashlytics 에 대해 (0) 2023.03.05 댓글