Asyncronous vs Synchronous vs Blocking vs Non-Blocking

jiho·2021년 5월 26일
0

프로그래밍을 공부하다가 기초 수준을 벗어나서 프레임워크 및 API를 공부하게될 때 알아야만하는 개념들이 있습니다.

  • Blocking
  • Non-Blocking
  • Asyncronous
  • Syncronous

위 4가지의 개념을 잘 구분하는 것이 정말 중요합니다.

NodeJS가 주목받았던 이유인 Event driven Asynchronous Non-Blocking 방식의 IO처리였습니다. 여기서 Asynchronous 와 Non-Blocking을 제대로 이해하지 못했다면 NodeJS를 잘 모르고 쓰고 있는 거라고 봐도 무방할 정도입니다.

자바에서도 NIO, NIO2 라는 Java SE API가 등장했습니다. 기존 Stream 기반의 Blocking API들이 있는데도 왜 등장했는지를 이해하기 위해서 Non-Blocking 개념을 알아야합니다.

이번 기회에 제대로 잘 정리해보겠습니다.

Blocking vs Non-Blocking

NonBlocking 과 Blocking 의 차이는 꽤나 직과적입니다.

NonBlocking은 특정한 일을 시켰을 때 완료여부와 상관하지않고 즉각적으로 다음 할 일을 진행하지만 Blocking은 일이 완료될 때까지 기다린 후 다음 할 일을 진행하는 것을 말합니다.

두 개념을 설명할 때는 요청한 일을 끝날 때까지 기다리는 지가 주요 관심사입니다. 응답에 어떤 상태 값이 있어야하는지, 요청한 일이 어떻게 처리되는지 등등 API에 따라 달라집니다. 비동기와 동기개념과 구분할 때 중요한 내용이니 기억하면 좋을 것 같습니다.

Asynchronous vs Synchronous

이번 비교를 위해 단어의 의미를 한번 더 생각해보면 Synchronous는 하나의 작업에 쓰이는 말이 아닙니다. 흔히 두 개의 작업은 동기적으로 동작한다.와 같은 식으로 말을 합니다. 단어 자체도 "connected" 혹은 "dependent" 를 의미합니다.

두 가지의 synchronous 작업은 서로를 인지하고 하나의 작업은 다른 작업에 의존하는 방식으로 실행됩니다. (다른 작업이 끝날 때까지 해당 작업의 시작을 기다리는 방식과 같이)

Asynchronous는 독립적인 것을 의미합니다. 하나의 작업이 다른 작업을 전혀 고려하지 않습니다.

시각적인 이해를 위해 각 방식의 thread 흐름을 보겠습니다.

  • Synchronous (one thread)
1 thread ->   |<---A---->||<----B---------->||<------C----->|
  • Synchronous (multi-thread)
thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->|
  • Asynchronous (one thread)
         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 
  • Asynchronous (multi-thread)
thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|

위 그림은 multi-thread와 single-thread에서의 동기와 비동기의 동작을 나타냅니다. Syncronous 와 Asyncronous의 개념은 Thread와는 전혀 관련이 없다는 것을 나타내기위해 거의 찾아보기 힘든 single thread에서의 비동기 처리, multi thread에서의 동기처리도 위와 같이 나타냈습니다.

Asyncronous 사용

많은 Engineering Problem를 해결할 때, 소프트웨어는 전체 문제를 여러 개의 부분 작업들로 나누고 각 작업을 비동기로 실행하도록 설계됩니다. 행렬의 반전하거나 혹은 제한된 수의 요소를 분석하는 문제와 같은 경우가 좋은 예시입니다. 흔히 분할정복(Divide and conquer)이라는 문제들이 이에 해당합니다.

꼭 Multi Thread들에 의해 처리될 필요는 없습니다. 오직 하나의 Thread로 첫번째 작업이 끝나기 전에 두 번째 작업을 처리하도록 코드를 작성할 수도 있습니다.(Nodejs가 event queue를 이용해서 single thread로 여러 IO를 처리하듯이)

중요한 점은 두 번째 작업의 input으로서 첫번째 작업을 결과가 필요 없어야한다는 점입니다.

https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean

Asynchronous 와 Non-Blocking은 차이는?

이번 비교에서 주의할 점이 있습니다. 간혹 Blocking와 Synchronous, Non-Blocking 과 Asynchronous가 같은 것이 아닌가 헷갈려 하는 경우가 있습니다. 엄연히 말해서는 다르지만 대부분의 자연스러운 사용은 아래와 같이 묶어서 사용해서 한쪽 개념은 생략해서 말하는 경향이 있습니다. (물론 반대로 조합해서 사용해도 되지만 뭔가 부자연스러운 사용이 될 것입니다.)

  • Blocking + Synchronous
  • Non-Blocking + Asynchronous

이와 관련해서 클라이언트 어플리케이션 개발에서 흔히 다뤄지는 내용 있습니다.

UI Thread와 서버 데이터 Fetch 작업은 비동기적으로 동작해야한다.

UI관련 작업을 담당하는 Thread와 네트워크에 데이터를 요청해서 받아오는 작업은 당연히 NonBlocking으로 처리를 해야 Network Delay에 의해 UI동작이 막히지 않을 것입니다.

물론 UI를 처리하는 작업은 Data Fetch 작업에 의존하지 않기 때문에 비동기로 동작을 합니다. 데이터를 받아와서 화면에 갱신하는 작업이면 의존하는게 아닌가? 라는 의문이 들 수 있지만 대부분의 Client Application들은 Data Fetch Thread가 데이터를 획득하자마자 직접 화면 갱신을 하지않고(못하게 할 수도) UI Thread가 화면 갱신을 위임하게 됩니다. 결국 다시 정리하면 Data Fetch Thread는 UI 작업과는 의존하지않습니다.

요약

설명이 장황했지만 핵심 키워드는 다 말한 것 같습니다. 정말 Asyncronous, Syncronous, Blocking, Non Blocking을 이해했는지 확인하고 싶으면 아래 경우를 다 떠올릴 수 있는지 확인 해보시면 될 것 같습니다.

  • Blocking Syncronous 는 어떻게 동작하는지
  • Blocking Asyncronous 는 어떻게 동작하는지
  • Non-Blocking Syncronous 는 어떻게 동작하는지
  • Non-Blocking Asyncronous 는 어떻게 동작하는지

Non Blocking 과 Blocking은 작업 요청에 대한 완료 여부에 따른 작업흐름 과 관련되 있고 Asyncronous, Syncronous는 두 가지 작업의 의존 관계 여부와 관련된 용어들이라는 것을 명심하면 좋을 것 같습니다.

Reference

https://stackoverflow.com/questions/2625493/asynchronous-and-non-blocking-calls-also-between-blocking-and-synchronous

위 참조사이트는 스택오버플로우에 많은 사람들이 이해를 위해 남겨놓은 글들이 많습니다. 살펴보시면 이해에 도움이 많이 될 것 같습니다.

profile
Scratch, Under the hood, Initial version analysis

0개의 댓글