봉황대 in CS

Blocking vs. Non-Blocking / Synchronous vs. Asynchronous 본문

Computer Science & Engineering

Blocking vs. Non-Blocking / Synchronous vs. Asynchronous

등 긁는 봉황대 2024. 5. 6. 02:11

이번 학기에 '협동 분산 시스템' 과목을 수강하는데, 'Design Issues of Clients and Servers'라는 주제가 있었다.


client와 server 각각 사용 편의성을 제공하기 위해서, 그리고 사용자에게 더욱 빠른 서비스를 제공해 주기 위해서는 어떤 이슈들이 존재하며 그들을 해결하기 위해서는 어떤 기법을 사용할 수 있는지를 다루었다.
 
server 쪽에서는 multi-threading을 통해서 performance를 올리는 것을 중점적으로 다루었는데, 여기서 갑자기 single-threaded server이지만 parallelism을 제공하여 성능 향상을 줄 수 있는 방법은 asynchronous non-blocking system call을 사용하는 것이라고 하셔서 대혼동이 발생했다.
 
두 개념은 각각 어떠한 차이가 있으면서, single-threading과 multi-threading과는 무슨 관계가 있는가?

 

 

Single-threading, Multi-threading과는 관계가 없는 개념들이다 !


Blocking, Non-blocking / Synchronous, Asynchronous 이 개념들은
한 thread에서 어떠한 task(function, system call, I/O request 등)을 호출했을 때에 어떻게 행동하는지에 관한 것이다.
 
즉, single-threaded 환경이든 multi-threaded 환경이든 상관이 없는 개념이며,

환경이 달라졌다면 그것에 따른 구현이 달라지는 것일 뿐이다. 이들을 함께 섞어서 생각하면 혼란만 가중된다. (경험담)
 
우선 지금부터는 단 하나의 thread만을 슥 뽑아와서 관찰하고 있다고 생각하자.
 
 

(Blocking, Non-Blocking) vs. (Synchronous, Asynchronous)


둘의 관심사는 아예 다르다.
 
- Blocking & Non-Blocking : task를 실행하는 놈에게 제어권을 넘겨주는가?
- Synchronous & Asynchronous : return 값을 받는 순서에 관심이 있는가?
 
 

Blocking vs. Non-blocking


관심사 : 제어권
 

Blocking

Blocking is when a function holds control until finishing a task.


한 thread가 어떠한 task를 실행하면, task의 수행이 완료되어 return을 할 때까지 waiting(대기) 상태가 된다.
즉, 실행 제어권이 해당 task에게 넘어가버리는 것이다.
 
일반적으로 함수 호출은 blocking 방식으로 진행된다.
 

Non-blocking

Non-blocking is handing over control to another function while finishing for current task.
 

한 thread가 어떠한 task를 실행하면, 그것이 작업을 완료했든 말든 다른 로직을 수행할 수 있다.
즉, 제어권이 해당 task로 넘어가지 않고, 그것을 호출한 thread가 계속 가지고 있게 된다.

 

 

Synchronous vs. Asynchronous


관심사 : 순서
 

Synchronous

Synchronous programming executes tasks one at a time, waiting for a previous task to be finished before moving onto another. This can be reliable in a a program that relies on completion in a sequential order.

 
어떠한 task를 수행하라고 명령한 thread는 해당 task의 return 값이 자신에게 언제 돌아오는지에 대한 순서를 신경 쓴다.
application이 지정한 순서대로 함수 호출과 반환이 지켜져야 한다는 것이다.

 

일반적으로 함수 호출은 synchronous 하게 진행된다.

 

Asynchronous

Asynchronous programming does not rely on a task to occur in a specific order. It can be used in situations where tasks should be handled without blocking the main thread, and to do multiple tasks that can be processed at the same time.


어떠한 task를 수행하라고 명령한 thread는 해당 task의 return 값이 자신에게 언제 돌아오는지를 신경 쓰지 않는다.
task를 동시에 실행시키면서, return 값을 자신에게 언제 던져줘도 상관이 없다는 것이다.

 

따라서 이 경우에는 보통 call back 함수를 구현하여 사용하게 된다.

task를 수행하는 놈은 자신이 해당 task를 끝냈다면 그 즉시 call back 함수를 호출하여 thread에게 return 값을 전달해 주게 된다.

 

 

(Blocking || Non-Blocking) && (Synchronous || Asynchronous)


가능한 4가지 조합을 모두 생각해 보자.

 

Blocking && Synchronous

일반적인 함수 호출을 생각하면 된다.

 

Blocking && Asynchronous

 

asynchronous 하기 때문에 thread는 다른 일을 할 수 있지만,

blocking이기 때문에 thread는 해당 task가 끝날 때까지 그냥 계속 기다리게 된다.

 

결국, 성능 상의 이점은 하나도 없다. 가장 피해야 하는 설계로 생각된다.

 

Non-blocking && Synchronous

 

Non-blocking이기 때문에 thread는 task 수행을 명령시켜 놓고, 다른 일을 진행할 수 있다.

 

단, task의 수행을 명령한 thread는 해당 작업이 완료되었는지를 계속 tracking 해야 한다.

위의 그림에 그려놓은 것처럼 task를 수행하는 놈한테 '작업이 완료되었니~?' 하고 계속 주기적으로 물어봐야 하고,

task가 완료되었다면 task 수행의 결과값(return 값)을 가져오게 된다.

 

하지만 만약 수행하라고 명령한 task의 return 값을 받아야 하는 시점이라면 (synchronous)

thread는 다른 일을 진행하지 못하고 그 return 값만을 계속 기다리는 상황이 발생할 수 있다.

 

---

 

위의 그림과는 다르게, 동시에 수행하지 못하는 task라면 아래와 같이 진행될 수도 있다.

 

datagram이 도착하지 않아 I/O를 수행할 수 없는 상황에서는 바로 return을 하다가,

datagram이 도착했다면 I/O 요청을 수행하느라 application thread는 잠깐 대기하고 있는 것을 볼 수 있다.

 

출처 : Addison Wesley : UNIX Network Programming Volume 1, Third Edition: The Sockets Networking API

 

Non-blocking && Asynchronous

 

Throughput을 높일 수 있는 가장 이상적인 상황이다.

 

 


여담: Blocking vs. Synchronous

이 주제에 대해서 생각하면서 계속 헷갈렸던 부분이다.

 

Synchronous 하게 한다면 task를 호출하는 thread는 무조건 blocking 되는 것이 아닌가?

결국, 이 둘은 무슨 차이가 있는 걸까?

 

위에 작성한 것처럼 4가지 조합을 전부 생각해 보고 그려보니, 이건 완전히 잘못된 생각이었다.

(non-blocking && synchronous) 조합에서 볼 수 있듯이 상황에 따라서 thread가 대기하고 있는 상태가 될 수도, 안 될 수도 있는 것이다.

 

 

아무튼, Blocking, Non-blocking / Synchronous, Asynchronous 두 개념은

task의 실행에 대해서 서로 보는 관점이 다르다는 것을 계속 상기하도록 하자.

 

참고

 

Glossary of Terms : async & sync, single & multi-threading, blocking & non-blocking

Async & Sync

medium.com

 

반응형

'Computer Science & Engineering' 카테고리의 다른 글

[CPU] How to Implement CPU(or Core) Pinning  (0) 2024.08.05
[CPU] What is Hyper-Threading ?  (1) 2024.07.15
Git Terminal Commands  (0) 2021.11.13
Comments