[Programming] 비동기 관련 용어에 대해서 — 3

gaeng2y
4 min readDec 25, 2022

--

안녕하세요! 갱입니다. 🫡

이전 포스팅

오늘은 비동기 관련 용어 마지막인 blocking / non-blocking에 대해 알아보겠습니다.

때는 바야흐로 2020년 소마에서 자유 멘토링을 들을 때였습니다…

어떤 멘토님께서 비동기 프로그래밍을 구현할 때 blocking과 nonblocking에 대해 알고 구현을 해야 한다고…

멘토님 그 때의 무지몽매한 저는 2년 반이 지나서 정리를 하고 있습니다…

Blocking / Non-blocking

가장 대표적인 IBM의 아티클에서 가져온 이미지를 보시죠.

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

이 그림을 보면 Blocking이면 반드시 Sync가 아니고, Non-blocking이면 반드시 async도 아니라는 점이다.

그렇다면 Sync와 Async는 이전 포스팅에서 작성하였으니 Blocking과 Non-blocking에 대해 알아보죠.

Blocking

  • A 함수가 B 함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것.

Non-Blocking

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

그렇다면 위의 네가지 개념을 바탕으로 그림을 이해해보자.

출처 : https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Sync-Blocking과 Async-NonBlocking은 많이 접해봤으니 그림으로 이해해보자.

Sync-NonBlocking

출처 : https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

여기서 부터 일반적인 케이스가 아니라는 생각이 들 수 있어서 어려울 수 있습니다.
하지만 위에서 간단히 요약한 4가지 개념의 특성을 적용하면 의외로 이해할 수 있습니다.

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

조합해보면 B 함수가 바로 제어권을 돌려주기에 A 함수는 다른 작업을 수행할 수 있지만, 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 한다.
A 함수가 직접 결과를 처리해야하는 상황이기에 B 함수의 종료를 반복적으로 물어봐야 하는 경우이다.

Async-Blocking

출처 : https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Swift에서 사용하는 @escaping 클로저의 경우가 여기에 해당한다!

--

--