Sync & Async와 Blocking & Non Blocking의 차이

석형원·2024년 11월 14일

Synchronous와 Asynchronous, Blocking과 Non Blocking의 차이가 유사하면서도 다르기에,
제가 이해한대로 한번 정리해보고자 합니다.

먼저, 간단히 정리해보자면

Synchronous와 Asynchronous는 요청에 따른 결과들의 순서가 지켜지느냐, 아니냐의 차이입니다.

Blocking과 Non Blocking은 요청에 대한 결과를 기다리느냐, 기다리지 않느냐의 차이입니다.

Sync, Async, Blocking, Non Blocking

하나씩 살펴보겠습니다.
A 함수와 B 함수가 있다고 할 때, A함수 내에서 B함수를 호출한다고 가정하겠습니다.
ex) A(){B()}

  • Synchronous : 호출한 함수(A)가 호출된 함수(B)를 처리합니다.
    ( A는 B가 종료됬는지 계속해서 확인하고 확인이 된 후 종료됩니다. )
    • 결과에 대한 순서가 고정됨 ( B -> A )
  • Asynchronous : 호출된 함수(B)는 스스로(B)가 처리합니다.
    ( 각 함수는 스스로 처리하므로 어떤 함수가 먼저 완료될지 알 수 없습니다. )

    • 결과에 대한 순서를 알 수 없음 ( B? A? )
  • Blocking : 호출한 함수(A)는 호출된 함수(B)가 완료될 때까지 기다립니다.

  • Non Blocking : 호출한 함수(A)는 호출된 함수(B)를 기다리지 않고 작업을 이어서 수행합니다.

Sync & Async + Blocking & Non Blocking

이제 두가지를 섞은 모델을 한번 살펴보겠습니다.
A, B, C 함수가 존재한다고 할 때, A 함수가 B 함수를 호출하고 B 함수가 C 함수를 호출한다고 가정하겠습니다.
ex) A(){B(){C()}}

Sync - Blocking

Sync는 함수 내에서 호출한 함수는 호출한 함수가 처리해야하므로 함수들의 처리 순서가 고정됩니다.
( C -> B -> A )

Blocking은 함수를 호출했을 때 그 함수가 끝나길 기다려야하므로 다른 일을 할 수 없습니다.

즉, 자연스럽게 A->B->C 순으로 실행되고 C->B->A 순으로 끝나게됩니다.

이를 A 함수가 동작하는 시간으로 보자면,
Blocking에 의해 다른 함수의 처리될 때까지 대기해야하므로,
A의 동작 시간 = C + B + A가 됩니다.

Async - Blocking

Async는 호출한 함수와 무관하게 호출된 함수가 스스로를 실행하므로 무엇이 먼저 끝나는 지 알 수 없습니다. ( 종료 순서 모름 )

Blocking은 호출된 함수가 끝날 때까지 기다립니다.

이를 종합해보면,
Async이기 때문에 함수가 각자 실행되므로 종료 순서를 알지 못해야하지만,
Blocking에 의해 기다려야하므로 함수 종료 순서가 고정이 됩니다.
( C -> B -> A )

즉, Async의 의미를 상실해 Sync-Blocking 모델과 다를 바가 없어진다는 것이죠.
따라서 Async-Blocking 모델은 사실상 의미가 없습니다.


출처 : https://developer.ibm.com/articles/l-async

그러나 위 IBM의 문서를 살펴보면 Async-Blocking 모델이 I/O multiplexing(select/poll)이 되어있는데

select() 함수가 여러 개의 클라이언트 I/O(어느 결과가 먼저 올지 모르는 Async)를 기다리는 Block이기 때문이라고 합니다.

다만, 이 부분도 select()함수가 timeout으로 빠져나가도록 설정되어있어 blocking이 아니다라는 말이 있어서 의미가 없는 모델인지 쓰임새가 있는지 확실하지 않습니다.

Sync - Non Blocking

Sync의 특징은 호출한 함수가 호출된 함수를 처리한다는 것.
( 종료 순서 고정 )

Non Blocking의 특징은 호출된 함수가 끝나길 기다리지 않고 이어서 작업한다는 것.

정리해보면,
각 함수가 서로 별도로 수행이 되지만 호출된 함수가 끝나기를 기다려야하기 때문에,
호출한 함수가 먼저 끝났더라도 호출된 함수가 끝났는지 지속적으로 확인해야합니다.

이를 시간의 흐름에 따라 그려보면 아래와 같습니다.

A가 먼저 수행을 마쳤더라도 B가 종료될 때까지 계속해서 확인하면서 대기해야한다는 것이죠.

Async - Non Blocking

Async의 특징은 호출된 함수가 스스로를 처리한다.

Non Blocking의 특징은 기다리지 않는다.

즉, 호출한 함수(A)는 호출된 함수(B)를 실행시키는 트리거 역할만 할뿐 결과에 대해서 신경을 쓰지 않는다는 것이죠.
서로 각자 별도로 수행되고 스스로 끝나게 됩니다.
당연히 그에 따른 종료 순서도 알 수 없습니다.

이를 시간의 흐름에 따라 그려보면 아래와 같습니다.

회고

제가 이해한 내용을 바탕으로 작성한 것이기에 잘못된 내용이 있을 수 있습니다.
감안하고 봐주시면 감사하겠습니다.

그리고 아직 의문이 드는 부분도 있습니다.

  • Sync는 모든 함수를 하나의 스레드가 처리하는가?

  • 만약 그렇다면 결국에 요청한 함수가 종료되는 시간이 Sync-non blocking과 Sync-blocking이 동일한게 아닐까?

나중에 실제로 검증해보는 시간을 가져보도록 하겠습니다.

참고

profile
데이터 엔지니어를 꿈꾸는 거북이, 한걸음 한걸음

0개의 댓글