ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 에 대해까지 설명하기에는 너무 길어질 것 같아 따로 잘 정리된 글이 있어 해당 내용은 이 글을 참고해보면 좋을 것 같다.

     

    https://kotlinworld.com/141

     

    [Coroutine] 3. Coroutine의 Dispatcher 란 무엇인가?

    Coroutine을 공부하면서 Dispatcher에 대해 상세히 설명된 글이 없어서 이 글을 작성하게 되었다. 많은 사람들에게 도움이 되길 바란다. Dispatcher 코루틴을 시작하게 되면, Dispatcher란 단어를 가장 먼저

    kotlinworld.com

     

    짧게 설명하자면 코루틴은 코틀린에서 쓰레드에 전달하기 위한 최소 작업 단위이고, Dispatchers 는 이 작업을 본인(Dispatchers) 이 관리하고 있는 쓰레드풀 중에 쉬고 있는 쓰레드에 작업을 할당해주는 작업반장 같은 역할이다.

     

    그래서 저 Dispatchers.LOOM 키워드를 이용하면 커널 쓰레드가 아닌 화이버를 쉽게 이용할 수 있다는 사실

     

    재밌네요

     

    이 Loom 프로젝트의 등장으로 인해 리액티브(Rx) 프로그래밍의 시대가 끝났다고 말하는 사람들도 있다.

     

    기존에 리액티브 프로그래밍으로 개발된 코드의 가독성이 너무 떨어졌을 뿐더러 속도 자체도 코루틴이 더 빠르다는 평이 있었는데, 그보다 더 빠르고 가볍게 코루틴을 이용할 수 있는 기술이 생겨서 그런 것 같다.

     

    댓글

Designed by Tistory.