비동기와 멀티스레딩

The Difference Between Asynchronous And Multi-Threading

Posted by jay on September 2, 2021

1. 소개

비동기 프로그래밍과 멀티 스레딩 프로그래밍에 대해 알아보고, 차이점을 비교해보자.

2. 비동기 프로그래밍이란

비동기적 모델에서는 여러 일이 동시에 발생할 수 있다. 프로그램은 실행시간이 긴 함수를 실행할 때, 그 함수의 실행 흐름을 막지(block) 않고, 프로그램을 계속 실행한다. 그리고 그 함수가 끝났을 때, 프로그램은 실행결과에 접근한다.

예를 들면, 네트워크를 통해 2개의 파일을 가져와 결합하는 프로그램이 있다고 했을 때

sync-1024x658

비동기 시스템에서는, 추가적인 스레드를 시작하여 해결한다. 첫번째 스레드는 첫번째 파일을 가져오고(fetch), 두번째 스레드는 첫번째 스레드가 끝날 때까지 기다리지 않고 두번째 파일을 가져온다. 그 다음, 두 스레드는 서로가 결과를 가져올 때까지 기다린다. 두 스레드 모두 결과를 가져왔을 때, 두 결과를 합치기 위해 재동기화한다.

단일 스레드 접근(single-thread approach)의 또 다른 예로는, OS에서 파일을 가져와서 연산을 하는 것이 있다.

비동기 시스템에서는, OS에게 실행할 파일을 요청하고 기다리는 동안, CPU에서 실행되는 수학적 계산을 수행하고 반환한다.

비동기 프로그램의 접근방식은, 실행속도가 느린 함수를 하나 실행하고, 그 동안 추가적인 콜백(callback) 함수들을 실행하는 것이다. 행위가 시작하고 끝날 때, 콜백함수가 결과와 함께 호출된다.

3. 멀티스레딩 프로그램이란

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

단일 프로세서(single processor)에서, 멀티스레딩으로 실행하는 프로그램은 마치 병렬적으로 실행되는 것 처럼 보인다. 하지만 실제로는, 한 프로세서가 스케줄링 알고리즘을 통해 문맥을 전환(switching)해가며 실행하는 것이다.

다중 프로세서(multiple processor) 코어에서의 스레드들이 실제로 병렬적이다. 개별 마이크로프로세서들(individual microprocessors)이 함께 작동하며 결과를 더 효율적으로 달성한다. 여러 작업이 병렬, 동시적으로 수행된다.

멀티스레딩의 예를 들면, 웹 브라우저에서, 서로 다른 두 탭을 통해 두 개의 파일을 다운로드 받는 것이다. 각 탭은 요청된 파일을 다운로드하기 위해 각각 새 스레드를 사용한다. 서로의 탭이 완료되기를 기다리지 않으며, 동시에 다운로드한다.

다음 그림은 다중 스레드 어플리케이션의 동시 실행에 대한 설명이다.

multithreading-1024x514

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

상술한 정의를 통해, 우리는 멀티스레딩 프로그래밍은 여러 다른 함수들을 동시에 실행하는 것이고, 비동기 프로그래밍은 여러 함수들이 non-blocking 으로 실행되는 것임을 알았다. 그리고 비동기적이라는 것은 단일 스레드, 멀티 스레드 모두에게 적용될 수 있다.

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

간단한 비유를 들어보자면: 나와 한 친구가 오늘 저녁 식사를 함께 한다고 가정해보자.

여기서 비동기적 행동은, “너(친구)는 가게에 가서 파스타를 사와, 나는 그동안 소스와 음료수를 준비하고 있을게.“라고 말하는 것이다.

그리고 스레딩이란, “너는 물을 끓여. 나는 토마토 소스를 볶을거야.”, “물이 끓으면(When), 나한테 알려줘. 파스타면을 넣을게. 소스가 데워지면(When), 너가 치즈를 넣어줘”, “면과 소스가 완성되면(When), 나는 의자에 앉을게, 너는 서빙해줘. 그 다음에 같이 식사하자.”라고 말하는 것이다. 이 상황에서, 우리는 각 사람(스레드)의 일련의 명령 집합(sequential set of instructions)을 나타내는 “When, Do” 시퀀스를 볼 수 있다.

정리하자면, 멀티스레딩은 작업자(Thread)에 관한 것이고, 비동기는 작업(Task)에 관한 것임을 알 수 있다.

5. 어느 것을 사용해야하는가

두 모델 중 하나를 고를 때, 고려해야 할 요소는 성능이다.

동기 / 비동기 + 단일 스레딩 / 멀티스레딩의 조합에서 무엇의 성능이 더 좋을까?

간단히 말해서, 여러 컴퓨터에서 많은 I/O 작업과 다양한 연산이 처리되는 대규모 어플리케이션에서는, 비동기 + 멀티스레딩 프로그래밍이 적합하다. 우리는 이를 통해 컴퓨터 자원을 더 효율적으로 활용하고, non-blocking 함수들을 처리할 수 있을 것이다. (모든 OS는 비동기 + 멀티스레딩 모델을 사용한다.)

하지만 더 큰 힘에는 더 많은 책임이 따른다. 만약 비동기 + 멀티스레딩을 사용하기로 했다면, 우리는 race condition, deadlocks, shared resources, and callbacks events 같은 문제들을 처리해야한다.

Baeldung의 동의하에 글을 번역하고 정리하였습니다.

참고 글: https://www.baeldung.com/cs/async-vs-multi-threading