블로킹과 논블로킹, 동기와 비동기

이지용·2022년 11월 25일
1

TIL

목록 보기
3/4

1. 블로킹(Blocking)과 논블로킹(Non-Blocking)

블로킹과 논블로킹의 차이를 말하기 앞서 제어권이라는 개념을 아는 게 중요하다. 제어권을 가진 함수는 코드 실행 중에 전체적인 흐름을 제어할 수 있다고 말할 수 있다.

함수 A에서 함수 B가 호출됐을 때 함수 B는 제어권을 넘겨 받았다면 함수 A는 실행을 멈추고 함수 B의 실행이 끝난 뒤에 제어권을 돌려받고 나서야 나머지 코드가 실행된다. 이게 블로킹 방식이다.

하지만 논블로킹 방식에서 함수 A가 함수 B를 호출하지만 제어권은 바로 가져온다. 함수 B의 결과가 나오든 말든 나머지 코드를 계속 실행시키는 것이다.

2. 동기(Synchronous)와 비동기(Asynchoronous)

블로킹과 논블로킹이 제어권의 반환 시기에 따라 구분됐다면 동기와 비동기는 호출자를 기준으로 함수 호출 후에 작업 완료 여부를 어디서 확인하는지에 따라 구분된다.

블로킹/논블로킹과는 구분짓는 기준이 다르기 때문에 서로 조합하여 총 네가지 방식으로 표현할 수 있는데, 여기서는 먼저 논블로킹 방식의 동기/비동기로 예를 들겠다.

함수 A에서 함수 B가 실행된다. 논블로킹 방식이기 때문에 함수 A는 계속해서 실행되며 실행 과정에서 함수 B의 완료 여부를 지속적으로 확인한다. 이를 동기 방식의 호출이다.

반대로 비동기 방식에서는 함수 A는 함수 B를 호출한 뒤로 완료 여부에 대해 확인하지 않는다. 함수 B의 실행이 완료되면 알아서 응답할 뿐이다.

3. 블로킹/논블로킹과 동기/비동기의 조합

위에서 말한대로 블로킹/논블로킹식과 동기/비동기식의 조합에 따라 나오는 네가지 방식에 대해 각각 정리해봤다.

1) 블로킹 동기

위에서 봤던 내용과 같다. 함수 A에서 함수 B를 호출하고 제어권을 넘긴 뒤 함수 B의 실행이 끝나 반환 값과 함께 제어권을 돌려받기 전까지 함수 A는 실행을 멈추고 기다린다. 그리고 함수 B가 종료되면 다시 실행되는 구조를 하고 있다.

2) 블로킹 비동기

먼저 함수 A에서 함수 B를 호출한다. 여기서 조금 특이한 점이 있는데, 함수 A에서는 함수 B의 실행 결과가 필요하지 않지만 제어권을 돌려받지 않는다. 그대로 함수 B가 종료되면 결과를 반환하는 대신 콜백 함수를 실행하는 등의 응답을 하며 제어권을 반납한다.

3) 논블로킹 비동기

다음은 노드js에서 가장 많이 쓰이는 논블로킹 비동기 방식이다. 위에서 말했다시피 함수 A가 함수 B를 호출한 뒤에 바로 제어권을 돌려받고 함수 B가 종료됐는지도 확인하지 않는다. 이런 방식에서는 보통 콜백 함수를 포함하여 호출하고, 호출된 함수가 종료되면 콜백 함수를 실행한다.

4) 논블로킹 동기

마지막 논블로킹 동기 방식이다. 함수 A는 함수 B를 호출하지만 제어권을 다시 돌려받고 하던 작업을 마저 한다. 하지만 지속적으로 호출된 함수의 종료 여부를 확인한다.

4. 정리

블로킹/언블로킹과 동기/비동기라는 개념에 대해 블로킹과 동기가 같고 논블로킹과 비동기가 같다고 생각하는 사람이 몇 있는 것 같다. 나도 어제까지 그렇게 생각했었는데, 기준만 정확히 알고 헷갈리지 말고록 하자.

0개의 댓글