2022.09.16 - [Development/Android] - [Android/안드로이드] JVM, JDK, JRE 얘들은 뭐지?
스레드(Thread)라는 게 무엇인지 알고 싶어서 조사하다가 자바(Java)가 어떻게 실행되는지 까지 알아봤었다. 워낙 쉽게 이해하기에는 복잡한 내용이라 완벽하게 이해가 될 정도는 아니지만 적어도 '아~ 그런 게 있었지'정도는 도움이 됐었다. 그래서 이번에는 본론인 코루틴(Coroutine)과 스레드(Thread)가 무엇인지 알아보았다.
스레드(Thread)는 뭐지?
스레드(Thread)는 '프로세스(Process) 내에서 작업의 내용을 담고 있는 주체'를 말한다.(어디서는 작업 단위, 또 어디서는 작업의 실직적인 내용 등이라고 설명한다.) 여기서 프로세스란 '프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 작업'을 뜻한다. 스레드는 한 개 이상이 존재할 수 있으며 비동기적으로 작업을 수행시키고 싶을 때 사용한다.
무식하게 이해해보자면
프로세스 = 앱
스레드 = 앱 내에 각 기능들 (UI를 그리는 코드, 조작에 반응하는 코드, 네트워크 통신하는 코드 등)
정도로 가능할 것 같다.
스레드는 한 개 이상이 존재할 수 있지만 동시에 실행되지는 못한다. 이는 운영체제가 스레드들의 수행 효율성을 판단해 스케쥴링해서 순차적으로 실행되어지기 때문이라고 한다. 만약 두 개의 스레드가 존재하고 실행되더라도 둘 중 하나의 스레드는 실행되고 남은 하나는 실행이 잠시 중단(Blocking)되는 식이다.
코루틴(Coroutine)은 뭐지?
코루틴(Coroutine)은 비동기적으로 실행되는 코드를 간소화할 수 있는 동시 실행 설계 패턴이라고 한다. 스레드도 비동기이지만 스케쥴링에 따라 순차적으로 실행되는 것과 다르게 코루틴은 상식적으로 생각하는 '동시' 실행이 가능하며 스레드를 중단시키지 않는다. 또한 스레드가 프로세스 안에서 한 개 이상 존재할 수 있듯이 코루틴 또한 스레드 내에서 한 개 이상이 존재할 수 있다. 단, 필요에 따라 의도적으로 suspend, join, runBlocking 등을 사용해서 순차적으로도 사용 가능하다.
동시성과 병렬성
알아보면서 여러 의문점이 들었다. 물론 깊게 이해 하지 못한 탓이 크겠지만...
스레드도 코루틴도 비동기적 실행인데 왜 두 가지나 존재하는가?
/
스레드는 비동기라면서 왜 순차적으로 진행시키지?
이러면 그냥 일반 함수 내의 기능들을 실행하는 거랑 똑같은 것 아닌가?
/
정확한 표현은 아니지만 스레드는 프로세스 안에 속하고 코루틴은 스레드 안에 속하며
둘 다 한 개 이상 존재가 가능하다면 코루틴을 무리하게 만들어 사용하면 처리 속도가 많이 느려질까?
그밖에 포스팅하면서도 여러 가지 생각을 했다. 이는 해소까지는 아니지만 '동시성'과 '병렬성'이라는 개념을 통해 어느 정도 완화시킬 수 있었다.
동시성은 스레드가 한 개 이상 진행 중일 때 이를 가상 병렬 처리 중의 한 형태로 시간 분할 방식 사용하는 비동기 처리라고 한다. 스레드는 한 개 이상 존재할 수 있지만 코어는 한 번에 하나의 명령만 처리할 수 있다. 때문에 사람이 보기에는 동시에 처리하는 것처럼 보여도 코어 내에서는 한 개 이상의 스레드가 실행 중이라면 이를 빠르게 교차해가며 수행함으로서 동시에 실행되는 것 처럼 보이는 방식이다.
이는 그림을 통해 보면 비교적 쉽게 이해할 수 있었다.
이처럼 스레드는 코어 내에서 빠르게 바꾸어 가며 수행된다.
병렬성은 정말로 우리가 생각하는 '동시'에 여러 작업이 수행되는 방식인데, 이를 위해선 동시에 수행하려는 작업만큼의 코어가 필요하다. 지나가면서 한 번쯤은 들어봤을 싱글 코어, 멀티 코어, 쿼드 코어, 헥사 코어 같은 CPU 코어 개수가 이걸 뜻하는 것 같다.
이 또한 그림으로 보자면
이처럼 표현된다.
결론적으로 스레드와 코루틴 둘 다 비동기적 수행은 맞지만 스레드는 병렬성 비동기 수행이고 코루틴은 동시성 비동기 수행이라는 것 같다.
게임하는 사람들은 간혹 들어봤을지 모르지만, 옛날 게임들 혹은 최적화 문제가 있는 게임들을 보면 권장 사양을 초과하는 스펙의 기기에서도 버벅거리는 렉이 발생되는데 이는 충분히 작업을 수행할 만큼의 코어나 스레드가 존재하는데도 멀티 코어를 사용하지 않고 싱글 코어 내에서만 작업들이 수행되게 만들어져 있기 때문이라고 한다.
위에서 설명한 개념으로 말하자면 '여러 가지 작업을 비동기적으로 수행시킨 것 까지는 좋은데 하나의 코어만으로 수십수백 개의 동시성 비동기 작업을 시켰다'정도가 아닐까?
조사하면서 여러 글들을 봤지만 다들 같은 말을 하는 것 같으면서도 조금씩 다른 것을 많이 느꼈다. 그렇다고 아예 개념 자체가 다른 것은 아닌 걸 보니 아마 각자 이해하려고 간략화하거나 조금이라도 이해하기 쉽게 하기 위해 조금씩 바꿔 설명하다 보니 그런 건가 싶다.
스레드는 특정 작업이 순차적으로 진행되어야만 할 때, 코루틴은 순서와 상관없이 동시다발적으로 진행시키고 싶을 때 사용하면 유용할 것 같다. 실제로 포트폴리오 프로젝트 진행 중에 통신 결과 값이나 데이터베이스 쿼리 결과 값을 받아 오고 난 후 실행되어야 하는 코드들이 있었는데 그때는 스레드나 코루틴을 알지 못해서 꾸역꾸역 콜백을 넣어서 해결했었다. UI나 네트워크 통신, 데이터베이스 등의 작업에 매우 편리할 것 같다.
정리하고 난 지금도 두리뭉실한 상태이긴 한데 그래도 윤곽 정도는 잡힌 것 같다.
https://angangmoddi.tistory.com/224
https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0
https://developer.android.com/guide/components/processes-and-threads?hl=ko
https://developer.android.com/kotlin/coroutines?hl=ko
https://whyprogrammer.tistory.com/596
https://www.codeproject.com/Articles/1267757/Concurrency-vs-Parallelism
'Android (Kotlin)' 카테고리의 다른 글
[Android/안드로이드] ANR이 뭐지? (0) | 2023.03.08 |
---|---|
[Android/안드로이드] Android Jetpack은 대체 뭐지? (2) | 2022.09.21 |
[Android/안드로이드] JVM, JDK,JRE 얘들은 뭐지? (0) | 2022.09.16 |
[Android/안드로이드] JSON, GSON 정리 (0) | 2022.09.06 |
[Android/안드로이드] first, firstOrNull, last, lastOrNull 이건 뭐지? (0) | 2022.09.05 |
최근댓글