
비동기 프로그래밍, 비동기 커뮤니케이션 등 비동기에 관한 내용들을 자주 접할 수 있어요. 또한, 컨퍼런스에서 많은 트래픽에 대응하기 위해 동기 방식에서 비동기로 바꾸었다는 소식도 많이 보았어요. 그래서 ‘비동기로 전환하는 이유가 뭘까?' 알아보려 해요.
즉, 여러 작업들을 순차적으로 실행하는 것이에요.
‘작업의 순서를 보장한다?’는 무슨 말일까?
’현재 작업의 응답’을 받는 시점과 ‘다음 작업을 요청’하는 시점을 맞추는 것이다.
즉, 다음 작업이 있다는 것 자체가 순서가 있다는 것을 의미하며, 이전 작업이 완료되기 전 까지 다음 작업은 수행되지 않는다.

하나의 Actor가 밥, 감자볶음, 찌개를 먹기 위해 조리하는 과정을 동기로 표현했어요. 각각의 작업들이 끝나야 다음 작업이 이루어져요. 하지만 우리는 밥을 먹기 위해 위에서처럼 하나의 작업이 끝나야만 다음 작업을 하지 않아요. 그러니 비동기에 대해 알아보아요.
즉, 여러 작업들을 독립적으로 실행하는 것이에요.

두 명의 Actor들이 할 작업들을 분리해서 각각 독립적으로 작업을 진행해요. Actor 1은 햇반 데우기와 찌개 끓이기의 작업을, Actor 2는 감자볶고 햄 썰기의 작업을 진행해요. 이렇게하면 동기보다 작업을 빠르게 끝낼 수 있어요. 그렇다면 네 명의 Actor가 있으면 더 빠르겠죠?

네 명이 각각 햇반 데우기, 감자 볶기, 찌개 끓이기, 햄 썰기 작업을 담당해니 이전의 v1 버전보다 더 빨리 작업이 끝나요. 그렇다면 이 방법이 가장 좋은 방법일까요?

이처럼 하나의 Actor가 내가 해야할 역할과 협력자가 해야할 역할을 분리하여 작업을 진행할 수도 있어요.

ver.3 처럼 해야할 역할과 협력자가 해야할 역할을 나누고 한 명에서 두 명으로 작업하는 사람을 늘리면 더욱 최적화 할 수 있어요. 네 명의 배우를 갖는 ver.2 와 비교해도 큰 차이가 나지 않아요.
비유를 했지만, 프로그래밍적으로 접근하면
Actor는 쓰레드이고,
전자레인지와 가스레인지는 I/O이고
ver.4 처럼 작업을 처리하는 것을 non-block I/O가 되요.
비동기 프로그래밍 == 멀티스레딩이란 인가?
비동기 프로그래밍은 여러 작업을 동시에 실행하는 프로그래밍의 방법론 중 하나이고,
멀티스레딩은 비동기 프로그래밍을 구현한 하나의 방법이다.
비동기 프로그래밍을 가능하게 하는 방법은 멀티스레딩과 non-block I/O 두 가지 방법이 있어요.

멀티스레드는 위의 ver.1 처럼 여러 작업들을 각각의 스레드가 나누어 작업들을 처리하는 것이에요.
멀티스레드는 여러가지 작업들을 멀티스레드가 나눠 가져 동시에 실행할 하는 방법이에요. 이 방식은 멀티 코어를 활용할 수 있지만, 작업을 수행하는 스레드가 많아지면 context switch 비용이 많이 들고, race condition을 방지하기 위한 처리도 필요해요.

non-block I/O는 위의 ver.3 처럼 싱글 스레드여도 여러 작업을 동시에 할 수 있어요.
non-block I/O는 CPU 작업과 I/O 작업을 동시에 처리하는 방법이에요. 하나의 싱글 스레드가 I/O작업을 하는데, 이 작업이 blocking 모드가 아니라서 또 다른 I/O 작업 혹은 CPU 작업을 할 수 있기에 싱글 스레드여도 동시에 작업을 처리한다고 표현해요.
위 두 방법을 잘 활용하면 적은 스레드로도 좋은 성능을 낼 수 있는 프로그래밍이 가능해요. 특히 요즘 대규모 트래픽에 대응하기 위해 백엔드 프로그래밍에서 스레드를 적게 쓰면서도 non-block I/O를 통해 전체 처리량을 늘리는 방향으로 발전하고 있어요.

위에서 그림을 되돌아보면
ver.2처럼 한 쓰레드가 하나의 작업만 맡으면 스레드가 많아지니 이보다는 스레드의 수를 낮추고,
ver.3처럼 한 쓰레드가 너무 많은 작업을 맡으면 작업 시간이 길어지니 이 보다는 작업의 개수를 낮추어서
한 스레드가 적당한 작업을 맡으면 적절한 개수의 스레드가 되도록 하는 것이에요.

작업이 순차적으로 실행되는가? → synchronous/asynchronous
작업(프로그램) 제어권이 넘어가는가? → blocking/non-blocking
비동기 프로그래밍, 비동기 I/O, 비동기 커뮤니케이션.. 비동기(asynchronous)라는 .. 참 많이 사용하는데요~ 각 맥락에 따른 의미를 설명합니다~ 들러보세영~ㅎㅎ