안드로이드에서 스레드와 코루틴 둘다 비동기 처리에 도움이 된다고 알고있을것입니다. 코루틴이 더 가볍고 스레드안에 여러개있을수 있기에 그렇다고 인지하고만 있을수도 있습니다. 그래서 이번 포스팅에서는 왜 코루틴이 빠른진 스레드와 코루틴의 차이가 무었이고 언제 사용이 되는지 작성해볼까 합니다.
스레드는 프로세스 하위에 종속되는 보다 작은 단위입니다. 각 스레드는 독립된 메모리 영역인 스택 을 갖습니다. 그스택은 프로세스의 독립된 메모리 영역인 힙안에서 배치되어있으며 각 스레드는 다른 스레드에게 스레드는 메모리를 공유 할수 없지만 힙은 그렇지 안습니다. 그렇기에 스레드를 블로킹하여 다른 스레드를 기다리는 동작등을 수행할때 context swiching을 통해 동작중인 스레드를 바꿀수 있는것이지요
안드로이드의 스레드는 주로 동시성 프로그래밍을 위한 기술로 사용됩니다. 동시성은 한 번에 여러 작업을 처리하는 것을 의미하지만, 이는 꼭 물리적으로 동시에 실행된다는 뜻은 아닙니다. 안드로이드의 스레드는 일반적으로 하나의 CPU 코어에서 여러 작업을 번갈아 수행하는 방식으로 동시성을 제공합니다. 쉽게 시분할 기법을 생각하시면됩니다. 여러작업을 일정 시간마다 나눠서 작업을 하는 기법입니다.
스레드는 각 태스크에 해당하는 스택 메모리를 할당받습니다. 그리고 여러 작업을 동시에 수행해야할 때 OS 는 어떤 쓰레드 작업을 먼저 수행할지, 어떤 쓰레드를 더 많이 수행해야 효율적인지에 대한 선점형 스케쥴링을 해야만하죠.
이러한 스레드는 동시성을 보장을 하기 위해 운영체제 커널에 의한 context swiching을 이용합니다.
코루틴 또한 동시성 프로그래밍을 위한 기술로 사용됩니다. 코루틴 스래드랑 다른점은 작업단위가 Coroutine Object라는것입니다. 이또한 객체이기에 JVM Heap 에 적재됩니다. 기존의 스레드는 커널에 의한 context swiching이되었지만 코루틴은 가벼운 객체이고 프로그래머의 코드를 통해 Switching 시점을 마음대로 정할수 있게됩니다. 또한 기존의 스레드를 설정해서 해당 스레드에서 코루틴을 실행할수도있습니다. 그만큼 스레드는 메모리상 더 가볍기에 현재는 스레드를 직접사용하기 보다는 코루틴을 사용하여 비동기 처리를 합니다.
안드로이드에서 비동기 처리를 위해 스레드와 코루틴을 사용할 수 있습니다. 코루틴은 스레드보다 더 가볍고 하나의 스레드 안에 여러 개를 생성할 수 있다는 특징이 있습니다. 이번 포스팅에서는 스레드와 코루틴의 차이점을 비교해보고, 코루틴이 왜 더 효율적으로 작동하는지 알아보겠습니다.
스레드란 무엇인가?
스레드는 프로세스 내에서 작동하는 작은 단위로, 독립된 메모리 공간인 스택을 갖습니다. 이 스택은 프로세스의 힙(Heap) 메모리 내에 배치되어 있습니다. 스레드 간에는 스택 메모리를 공유하지 않지만, 힙 메모리는 공유할 수 있습니다. 이로 인해, 스레드 간의 작업이 서로의 스택에 접근하지 않으면서도 힙 메모리를 공유할 수 있게 되죠.
안드로이드에서 스레드는 주로 동시성 프로그래밍을 위해 사용됩니다. 동시성은 물리적 병렬 실행이 아니라, 여러 작업을 번갈아 수행하여 동시에 처리되는 것처럼 보이게 하는 것을 의미합니다. 일반적으로 하나의 CPU 코어에서 여러 스레드가 짧은 시간 동안 작업을 나누어 처리하는 시분할 방식을 사용합니다. 즉, 운영체제가 어떤 스레드가 언제 실행될지 결정하는 선점형 스케줄링을 수행하며, 효율적인 작업 분배를 위해 필요할 때마다 실행 중인 스레드를 바꿉니다.
코루틴의 동작 원리
코루틴도 동시성 프로그래밍을 위한 기술이지만, 스레드와 달리 코루틴은 코루틴 객체(Coroutine Object) 단위로 작동합니다. 코루틴 객체는 JVM 힙 메모리에 저장되며, 스레드처럼 커널에 의해 강제로 스위칭되는 대신, 프로그래머가 코드에서 원하는 시점에 스위칭을 제어할 수 있습니다. 또한, 코루틴은 특정 스레드에 설정되어 해당 스레드에서 작동할 수도 있습니다.
코루틴은 메모리 사용 측면에서 스레드보다 훨씬 가볍습니다. 이로 인해, 안드로이드에서는 비동기 처리가 필요한 경우 스레드보다는 코루틴을 사용하는 것이 일반적입니다.
결론
스레드는 운영체제에 의해 관리되는 반면, 코루틴은 개발자가 원하는 시점에서 스위칭을 제어할 수 있는 비동기 처리 방식입니다. 또한, 코루틴은 메모리 사용이 적고 효율적이므로, 현재는 스레드를 직접 사용하는 것보다 코루틴을 통해 비동기 처리를 구현하는 것이 더 좋은 선택입니다.
참고
https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0
'안드로이드' 카테고리의 다른 글
안드로이드 앱 출시까지, 일한만큼[Earned Log] - 1, 기획 (1) | 2024.11.11 |
---|