기타

동기 vs 비동기 (feat. Blocking vs Non-blocking)

열심히 해 2024. 12. 23. 10:53

출처: https://www.ynnews.kr/news/articleView.html?idxno=196042

 

 

동기는 동시에 일어난다는 뜻입니다. 무엇이 동시에 일어난다는 것일까요? 바로 요청과 결과입니다.

 

동기란 요청과 그 결과가 동시에 일어난다는 것인데요. 동기 방식으로 동작한다면, 요청을 하면 시간이 얼마가 걸리든지 요청한 자리에서 결과가 주어져야 합니다. 

 

은행 창구를 예로 들 수 있습니다. 은행 접수원은 고객의 요청에 시간이 얼마가 걸리든지 그 자리에서 결과를 줍니다. 전산 처리가 오래 걸릴 것 같다고 다른 고객을 받으며 일하진 않죠.

 

사진=스타벅스코리아 제공

 

 

비동기는 동시에 일어나지 않는다는 뜻입니다. 요청과 결과가 동시에 일어나지 않는다는 것인데요. 요청을 처리하는 시간이 오래 걸린다면 그 시간동안 다른 일을 할 수 있음을 내포하고 있습니다.

 

예를 들어 '스타벅스'를 보겠습니다. 고객 A와 B가 있습니다. 먼저 A가 샌드위치를 데워달라고 주문합니다. 그 이후 B는 아메리카노를 만들어 달라고 주문합니다. 이때 직원은 샌드위치를 오븐에 넣어 데우고, 동시에 샌드위치가 데워지는 시간 동안 음료를 만들었습니다. 

 

이러한 방식으로 동작하는 것이 비동기입니다.

 


 

정리

  • 동기 프로그래밍(Synchronous): 작업이 순차적으로 실행되며 하나의 작업이 끝나야 다음 작업이 시작됩니다.
    • 예: 파일 다운로드가 완료될 때까지 프로그램이 다른 작업을 하지 못하고 기다리는 경우(다수의 게임)
  • 비동기 프로그래밍(Asynchronous): 작업이 비순차적으로 실행되며 작업이 진행되는 동안 다른 작업을 동시에 처리할 수 있습니다.
    • 예: 파일 다운로드가 진행되는 동안 사용자 입력을 처리하는 경우(크롬)

 

장단점

 

동기 프로그래밍

  • 장점:
    1. 구현이 간단하고 직관적입니다.
    2. 디버깅과 유지보수가 용이합니다.
  • 단점:
    1. 작업 대기 시간이 길어질 수 있습니다 (blocking).
    2. 병렬 처리에 부적합하며, 성능이 낮을 수 있습니다.

 

비동기 프로그래밍

  • 장점:
    1. 작업을 병렬로 처리할 수 있어 효율적입니다.
    2. 사용자 경험(UX)을 향상시키며 응답성이 뛰어납니다.
  • 단점:
    1. 구현이 복잡하며 디버깅이 어려울 수 있습니다.
    2. 비동기 코드의 흐름을 이해하고 관리하기 어렵습니다.

 


 

Blocking vs Non-blocking

 

이 둘은 기다리느냐, 기다리지 않고 다른 것을 하느냐의 기준으로 나뉩니다. 전자가 Blocking, 후자가 Non-blocking 입니다. 은행에서 고객이 접수원에서 어떤 요청을 보내고, 그 요청에 대한 응답을 하염없이 기다리면 Blocking, 기다리면서 핸드폰으로 다른 일을 한다면 Non-blocking 입니다.

 

동기 프로그래밍에서는 Blocking이 항상 발생합니다. 함수 A가 내부에서 B를 호출한다면, B의 결과를 기다려야 하는 것입니다.

 

비동기 프로그래밍은 기본적으로 non-blocking을 지향하지만, 특정 조건이나 코딩 방식에 따라 blocking이 발생할 수 있습니다. 스레드 풀이 가득 찬 경우를 예로 들 수 있습니다. 비동기 프로그래밍에서도 스레드 풀이 가득 차서 새로운 작업이 대기하는(blocking) 상태가 발생할 수 있습니다. 또 비동기임에도 락을 획득해야 하는 경우에는 blocking이 발생할 수 있습니다.

 

ExecutorService executor = Executors.newFixedThreadPool(2);

// 세 개의 비동기 작업을 실행
executor.submit(() -> longRunningTask());
executor.submit(() -> longRunningTask());
executor.submit(() -> longRunningTask()); // blocking