본문 바로가기
개발/Android

안드로이드 비동기, 멀티스레딩 차이

by 남트로 2023. 5. 8.

오늘은 비동기와 멀티스레딩의 차이에 대해서 알아볼 것이다.

 

먼저 비동기 프로그래밍은 안드로이드 개발을 하지 않더라도 개발자라면 무조건 필수적으로 알아야하는 개념중에 하나이다.

 

특히 안드로이드의 경우 RxJava나 Coroutine같은 비동기 라이브러리를 사용해 프론트(UI) 작업과 백그라운드 작업을 분리하여 사용해야하는 경우가 많기 때문에 더욱 중요하다고 볼 수 있다.

 

그렇다면 한번 자세히 알아보도록 하자

 

 

비동기프로그래밍?


일단 먼저 비동기 프로그래밍이란 무엇인지에 대해서 다뤄보려고 한다.

 

비동기적 모델에서는 여러 일이 동시에 발생할 수 있다.

 

일반적으로 코드를 작성하면 프로그램은 실행시간이 긴 함수를 실행할 때, 그 함수의 실행 흐름을 막지(block) 않고, 프로그램을 계속 실행한다.

 

그리고 그 함수가 끝났을 때, 프로그램은 실행결과에 접근한다.

 

예를 들어 두개의 파일을 가져와 결합하는 프로그램을 구현했다고 했을 때 비동기 시스템에서는 하나의 스레드의 작업이 끝날때까지 기다리지않고 추가적인 스레드를 시작하여 해결한다.

 

첫번째 스레드는 첫번째 파일을 가져오고 두번째 스레드는 첫번째 스레드가 끝날때까지 기다리지 않고 두번째 파일을 가져오게 된다

 

그런 다음에 두 스레드는 서로의 결과를 가져올때까지 기다리고 두 스레드 모두 결과를 가져왔을때 결과를 합치기 위해 재동기화를 하게 된다.

 

비동기 프로그램의 접근방식은 실행속도가 느린 함수를 하나 실행하고 그 동안 추가적인 콜백(callback) 함수들을 실행하는 것이다.

행위가 시작하고 끝날 때, 콜백함수가 결과와 함께 호출된다.

평소 비동기에 대해 지식이 없었을때의 우리는 일반적으로 안드로이드 개발을 할 때 동기 프로그래밍만 경험해봤을 것이다.

그래서 비동기의 개념이 생소하게 느껴질 것이고, 방대하고 복잡한 비동기 프로그래밍 라이브러리들의 사용방법을 익히는데에 시간이 좀 걸릴 수 있다.

 

하지만 비동기 프로그래밍을 구현하면 1개의 작업만 할 수 있는게 아니라 동시에 여러가지 작업을 수행할 수 있고, 이것은 곧 프로그램의 퍼포먼스와 속도를 향상시킬 수 있다는 큰 장점으로 이어진다.

 

우리는 이러한 이유로 적절한 때에 비동기 프로그래밍을 구현하는 것은 선택이 아닌 필수라고 볼 수 있다.

 



멀티스레딩?


멀티스레딩은 하나 이상의 순차적 명령어 세트(sequential set of instructions)를 동시/병렬적(concurrent/parallel)으로 실행하는 것을 말한다.

 

코드는 원래 순차적으로 실행되며 앞에 시간이 오래 걸리는 일이 있다고 했을 때 뒤 순서의 작업은 실행되지 못하고 기다린다.

 

이런 불편함을 개선하기 위해 동시적으로 처리하고 싶은 여러가지 해야 하는 작업이 있을 때 여러 스레드에게 각각 맡기는 것이 멀티스레딩이다.

 

단일 프로세서(single processor)에서 멀티스레딩으로 실행하는 프로그램은 마치 병렬적으로 실행되는 것 처럼 보인다.

 

하지만 실제로는 한 프로세서가 스케줄링 알고리즘을 통해 문맥을 전환(switching)해가며 실행하는 것이다.

 

멀티스레딩의 예를 들면 웹 브라우저에서 서로 다른 두 탭을 통해 두 개의 파일을 다운로드 받는 것이라고 볼 수 있다.

 

각 탭은 요청된 파일을 다운로드하기 위해 각각 새 스레드를 사용하고 서로의 탭이 완료되기를 기다리지 않으며, 동시에 다운로드한다.



비동기(Asynchronous) vs 멀티스레딩(Multithreading)


위 정리한 내용들을 통해서 우리는 멀티스레딩 프로그래밍은 여러 다른 함수들을 동시에 실행하는 것이고, 비동기 프로그래밍은 여러 함수들이 non-blocking 으로 실행되는 것임을 알았다.

 

그리고 비동기적이라는 것은 단일 스레드, 멀티 스레드 모두에게 적용될 수 있다.

 

따라서 멀티스레딩은 비동기 프로그래밍의 한 형태인 것이다.

 

 

멀티스레딩은 작업자(Thread)에 관한 것이고, 비동기는 작업(Task)에 관한 것이라고 보면 된다.

댓글