꾸물꾸물 졔의 개발공부

[CS] Blocking/Non-blocking , Sync/Async 본문

CS

[CS] Blocking/Non-blocking , Sync/Async

체제 2023. 5. 11. 22:42

이 그림을 봐서 가장 확실하게 알 수 있는건 Blocking 이라고 반드시 Sync 인게 아니며, Non-blocking 이라고 반드시 Async 인 것도 아니라는 것이다.  

 

즉, Blocking/Non-blocking 과 Sync/Async는 별개의 개념이다. 어디에 '관점'을 두고 있느냐에 따라 나눌 수 있다.

Blocking / Non-Blocking 은 호출된 함수가 자신을 호출한 함수에게 제어권을 돌려주느냐 마느냐, 

Sync / Async은 호출된 함수의 수행 결과와 종료를 호출한 함수가 처리하느냐, 호출된 함수가 처리하느냐의 차이이다. 


🔎Blocking / Non-blocking

Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신의 제어권이 있는지 여부로 구분한다.

 

블로킹 Blocking

A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 모두 끝날 때까지 A 함수에게 제어권을 돌려주지 않는 것 

 

즉, 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 해당 작업이 끝날 때까지 기다렸다가 자신의 작업을 이어서 하는 것을 의미한다.  

 

논블로킹 Non-Blocking 

A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것 

 

즉, 다른 주체의 작업 완료 여부와 관계 없이 자신의 작업을 하는 것을 의미한다. 

 

🔎Sync / Async 

Sync와 Async는 결과를 돌려주었을 때 순서와 결과에 관심을 가지고 있는지 여부로 판단한다. 즉 신경을 쓰고 있느냐 마느냐의 차이.

 

동기 Synchronous 

A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A 함수가 처리하는 것. 즉, 호출된 함수의 수행 결과 및 종료를 호출한 함수와 함께 신경 쓰는 경우를 의미한다. 

 

비동기 Asynchronous

A 함수가 B 함수를 호출 할 때, B 함수의 결과를 B 함수가 처리하는 것. (callback) 즉, 호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 쓰고 처리하는 경우를 의미한다. 


 

조금 더 단순하게 한마디로 정리해보면, 

  • Blocking / Non-Blocking : 제어권을 안넘기는지 / 넘기는지 
  • Sync / Asycn : 결과를 돌려줄 때 결과와 순서에 관심이 있는지 / 없는지 

 


Sync - Blocking / Async - Non-Blocking 모델 

가장 일반적으로 흔히 접하는 모델이다. 

 

Sync - Non Blocking 모델 

  • Synchronous : A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A가 처리하는 것 
  • Non-blocking : A 함수가 B 함수를 호출 한 뒤, B 함수가 A 함수에게 제어권을 바로 돌려주는 것 


( A : 호출한 함수 , B : 호출 된 함수 )

이 두 개념을 조합해보면, B 함수가 A 함수에게 제어권을 바로 돌려줌으로써 A 함수는 다른 작업을 수행 할 수 있지만, 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 한다. 

A 함수가 B의 작업 완료 여부를 신경쓰며 직접 B의 결과를 처리해야 하는 상황이기 때문에 B 함수의 종료 여부를 반복적으로 물어보며 확인해야 한다는 의미이다.  

 

👉 호출한 함수가 다른 작업을 수행 할 수 있게 되었음에도 불구하고 호출된 함수의 결과를 계속해서 신경써야 하기 때문에 제 할일을 못하게 되는 형태가 된다. 

 

 

Async - Blocking 모델 

  • Asynchronous : A 함수가 B 함수를 호출 할 때,B 함수의 결과를 B가 처리하는 것 (A는 B의 결과, 순서에 관심이 없음)
  • Blocking : A 함수가 B 함수를 호출 한 뒤, B 함수가 A 함수에게 제어권을 돌려주지 않는 것 

 

( A : 호출한 함수 , B : 호출 된 함수 )

최악의 조합. 두 개념을 조합해보면, A 함수는 B의 작업 결과에 관심이 없음에도 불구하고 B의 결과를 기다리고 있어야 하는 형태이다. 

 

이 조합은 굉장히 비효율적이고 흔한 케이스도 아니지만, 이 형태로 동작하는 경우가 있다고 한다.

대표적으로는 NodeJS와 MySQL의 조합. NodeJS에서 콜백 지옥으로 Async 방식을 사용해도 결국 DB 작업 호출시에는 MySQL에서 제공하는 드라이버를 호출하게 되는데, 이 드라이버가 Blocking 방식으로 동작하여 Async +Blocking 구조가 된다.🥲

 

 

🌟마무리 

흔히 접할 수 있는 모델은 Sync+Blocking / Async+Non-Blocking (동기/비동기) 형태의 모델이다. 추가적으로 Sync+Non-Blocking과 Async+Blocking 모델이 존재하긴 하지만, 비효율적이고 흔한 케이스도 아니다.

 

제어권을 가지고 있느냐 없느냐순서, 결과에 관심이 있느냐 없느냐를 기준으로 단어의 조합을 생각하여 살펴보자!