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

yeolyeol·2023년 6월 4일
1

til

목록 보기
3/8
post-thumbnail

동기와 비동기, 블로킹과 논블로킹은 전공생이거나 개발자로 취업을 준비하는 분들은 많이 들어봤을 것이다.
오늘은 동기와 비동기처리, 그리고 블로킹과 논블로킹이 무엇인지 알아보자.


시작하기 앞서

블로킹과 논블로킹, 동기와 비동기를 알아보기 전에 2가지 용어에 대해 선수지식이 필요하다.

  • 제어권

    • 제어권은 자신(함수)의 코드를 실행할 권리.
    • 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
  • 결과값을 기다림

    • A 에서 B 를 call 했을 때, A 가 B 의 결과값을 기다리느냐의 여부.

블로킹 / 논블로킹

블로킹과 논블로킹은 A 가 B 를 call 했을 때, 제어권을 어떻게 처리하느냐에 따라 달라진다.

A. 블로킹 (Blocking)

: 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 대까지 기다렸다가 자신의 작업을 시작

1. Flow

간단하게 A와 B를 모두 메서드라고 가정해보자.

  1. 처음에 A 메서드가 작업을 시작한다. 이때, 제어권은 A 메서드에게 존재한다.
  2. A 메서드에서 B 메서드를 호출한다.
  3. B 메서드가 호출되면서 A 메서드가 가지고 있던 제어권을 B 메서드에게 넘겨준다.
  4. B 메서드가 제어권을 갖고 실행한다.
  5. B 메서드가 작업을 마치면 다시 제어권을 A 메서드에게 전달해준다.
  6. 제어권을 받을 A 메서드가 다시 실행한다.

A 메서드에서 B 메서드로 제어권을 넘길 때 A 메서드는 B의 결과값을 기다린다.

2. 실생활(?) 예시

  1. A 사원이 B 팀장에게 전달할 서류를 작성함.
  2. B 팀장이 A 사원 호출.
  3. A 사원이 B 팀장에게 서류를 전달함. 이때, B 팀장이 내가 다 확인할 때까지 기다려! 선언.
  4. A 사원은 그 자리를 지키며 계속 기다림. 동시에, B 팀장은 A 사원이 작성한 서류 확인 중.
  5. 오랜 확인 끝에, B 팀장의 서류 확인이 끝나고 A 사원에게 서류를 주면서 엉망이군! 다시 해! 선언.
  6. A 사원은 눈물과 사직서를 머금고 다시 일하러 감.

B. 논블로킹 (Non-Blocking)

: 블로킹과 반대로, A 메서드가 B 메서드를 호출해도 제어권은 그대로 자신이 가지고 있는것.

1. Flow

  1. A 메서드 실행
  2. A 메서드가 B 메서드 호출
  3. 블로킹과 다르게 제어권을 넘기지 않고 B 메서드 실행. 제어권을 소유하고 있는 A 메서드는 이어서 작업 진행.

2. 실생활(?) 예시

  1. A 사원이 B 팀장에게 전달할 서류를 작성함.
  2. B 팀장이 A 사원 호출.
  3. B 팀장이 A 사원을 서류를 검토하면서, 고생했어요 :) 다른 작업 하시면 돼요.
  4. A 사원은 하던 일을 마저 진행.

다시 말해, 제어권을 누가 소유하는가, 어떻게 처리하는가에 따라 달라진다.


동기 / 비동기

동기와 비동기의 차이는 호출되는 함수의 작업 완료 여부신경쓰는지의 여부의 차이이다.

A. 동기 (Synchronous)

: A 메서드가 B 메서드를 호출한 뒤, B 메서드의 리턴값을 계속 확인하면서 신경쓰는 것

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미

1. 실생활(?) 예시

  1. 어느 카페는 커피를 주문하면 커피가 나올 때까지 기다렸다가 나오자마자 가져간다.
  2. B 팀장에게 서류를 전달한 A 사원은 B 팀장으로부터 피드백을 받는 즉시 서류에 대한 보완작업을 진행한다.

B. 비동기 (Asynchronous)

: A 메서드가 B 메서드를 호출할 때 콜백 함수를 함께 전달해서, B 메서드의 작업이 완료되면 함께 보낸 콜백 함수를 실행. A 메서드는 B 메서드를 호출한 후로 B 메서드의 작업 완료 여부에는 신경쓰지 않는다.

시작과 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미

1. 실생활(?) 예시

  1. 어느 카페는 커피를 주문하면 진동벨을 주며, 진동벨이 울리면 픽업하는 곳에서 가져간다.
  2. B 팀장에게 서류를 전달한 A 사원은 자리로 돌아가 다른 작업을 진행한다.

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

블로킹과 논블로킹, 동기와 비동기의 조합을 그림과 같이 살펴보자.

A. Blocking + Synchronous

블로킹과 동기의 조합은 블로킹의 흐름과 크게 다르지 않다.

추가된 것은 B 메서드로부터 결과값을 가져오는 것이다.
간단한게 설명을 해보자면, A 메서드는 B 메서드의 결과값을 필요로 한다(동기).
그래서 제어권을 B 메서드에게 넘겨주고, B 메서드가 실행을 완료하여 결과값과 제어권을 돌려줄때까지 기다린다(블로킹).

B. Non-Blocking + Synchronous

그렇다면 논블로킹과 동기는 어떨까?

A 메서드는 B 메서드에게 제어권을 넘기지 않는다. 따라서, A 메서드가 B 메서드를 호출한 뒤에도 A 메서드의 나머지 작업을 진행한다.(논블로킹)
하지만, A 메서드는 B 메서드의 결과값을 필요로 하므로 B 메서드가 끝날 때까지 계속 물어본다.(동기)

C. Blocking + Asynchronous

이번에는 블로킹과 비동기의 조합이다.

A 메서드는 B 메서드에게 제어권과 콜백 함수를 넘긴다.(블로킹)
A 메서드는 B 메서드의 결과값에 신경쓰진 않는다.(비동기)
하지만, 제어권을 넘겨주었기 때문에 B 메서드가 완료될 때까지 기다린다.

그림에서 알 수 있듯이, Blocking/Async 조합은 Blocking/Sync 별반 다를게 없다. 즉, 성능에 차이가 없어 Blocking/Async는 잘 사용하지 않는다고 한다.

D. Non-Blocking + Asynchronous

마지막으로 논블로킹과 비동기이다.

A 메서드는 B 메서드를 호출한다. 제어권은 넘기지 않는다. (논블로킹)
대신, A 메서드는 B 메서드에게 끝나면 알려달라는 콜백 함수를 넘긴다. (비동기)
A 메서드는 나머지 작업을 진행하다가 B 메서드의 콜백 함수를 통해 결과값을 받는다.

다음,

이렇게 블로킹과 논블로킹, 동기와 비동기의 의미와 특징, 조합들을 알아보았다.
다음 포스팅에는 Blocking/Sync로 동작하는 Spring MVC와 Non-Blocking/Async로 동작하는 Spring Webflux에 대해 다루겠다.

profile
한 걸음씩 꾸준히

0개의 댓글