Sync/Async, Blocking/Non-Blocking

Jimin·2024년 3월 21일
0

기타 IT 지식

목록 보기
5/5

Blocking/Non-Blocking

Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 구분한다.

Blocking

자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것을 의미한다.

🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 서류 검토 끝날 때까지 앞에서 기다리세요.

➡️ 호출된 함수(🐱)가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수(🐶)에게 제어권을 바로 돌려주지 않는 상황을 의미

Non-Blocking

다른 주체의 작업에 관련 없이 자신의 작업을 하는 것을 의미한다.

🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 서류 주고 가세요.

➡️ 호출된 함수(🐱)가 자신이 할 일을 모두 마치지 않았더라도 바로 제어권을 호출 건네주어 호출한(🐶) 함수가 다른 일을 진행할 수 있도록 해주는 상황을 의미


Sync/Async

Sync와 Async는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단한다.
즉, 순서와 결과에 신경을 쓰느냐 안쓰냐의 차이이다.

Sync

동기라는 뜻으로 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미한다.

🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 기다리거나 다른 일 하고 계세요. 강아지님 신경 안쓸게요.
(서류 읽는 중 ...)
🐱(호출된 함수): 강아지님 서류 이렇게 하세요.
🐶(호출한 함수): 고양이님 바로 처리하겠습니다.

➡️ 호출된 함수(🐱)의 수행 결과 및 종료를 호출한 함수(🐶)와 함께 신경 쓰는 경우를 의미

Async

비동기라는 뜻으로 시작과 종료가 일치하지 않고 끝나는 동시에 시작을 하지 않음을 의미

🐶(호출한 함수): 고양이님 서류 전달드리겠습니다.
🐱(호출된 함수): 강아지님 기다리거나 다른 일 하고 계세요. 강아지님 신경 안쓸게요.
(서류 읽는 중 ...)
🐶(호출한 함수): 강아지님 서류 이렇게 하세요.
🐱(호출된 함수): 고양이님 나중에 내용 확인하고 언젠가 처리하겠습니다.

➡️ 호출된 함수(🐱)의 수행 결과 및 종료를 호출된 함수(🐱) 혼자 직접 쓰고 처리하는 경우를 의미


Sync/Async + Blocking/Non-Blocking

  • Blocking/Non-Blocking: 제어권을 안 넘기는가/넘기는가
  • Sync/Async: 결과를 돌려줄 때 결과와 순서에 관심이 있는가/없는가

Sync + Non-Blocking

결과와 순서제어권
OO

호출되는 함수(B)가 바로 제어권을 돌려주며 호출한 함수(A)는 다른 작업을 수행할 수 있으나,
호출한 함수(A)는 호출되는 함수(B)의 결과를 처리해야하기 때문에 언제 종료되는지 알 수 없는 호출되는 함수(B)의 종료를 반복적으로 물어봐야한다

➡️ 호출한 함수(A)가 다른 작업을 수행할 수 있었음에도 불구하고 여전히 호출된 함수(B)의 결과에만 신경쓰기에 제 할 일을 못하게 되는 형태가 된다!

🐶 : 고양이님 서류처리 부탁드립니다.
🐱 : 강아지님 다른 일을 하고 계세요.
🐶 : 네.
🐱 : (서류 처리 중)
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 강아지님 아직이요.
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 강아지님 아직이요.
🐶 : 고양이님 서류처리 끝났나요?
🐱 : 네.

Async + Blocking

결과와 순서제어권
XX

최악의 조합일 수 있다. 호출한 함수(A)는 호출되는 함수(B)의 작업 결과가 관심 없음에도 호출되는 함수(B)의 결과를 기다리고 있어야 한다.

🐶 : 고양이님 서류처리 부탁드립니다.
🐱 : 강아지님 처리가 끝날 때까지 기다리세요.
🐶 : 고양이님이 어떤 작업을 하던 저와는 관계없지만 기다릴게요.

이 조합은 큰 이점이 없어 이 방식을 사용할 필요는 없으나 의도치 않게 이 형태로 동작하는 경우가 있다고 한다. 대표적으로 NodeJS와 MySQL의 조합에서 나온다고 한다.

NodeJS에서 콜백 지옥을 해치면서 Async로 전진해도, 결국 DB 작업 호출 시에는 MySQL에서 제공하는 드라이버를 호출하게 되는데, 이 드라이버가 Blocking 방식으로 동작하여 Async+Blocking 구조가 된다고 한다. (Java의 JDBC도 동일하다고 한다.)

Async + Non-Blocking 🌟

결과와 순서제어권
XO

Sync + Blocking 🌟

결과와 순서제어권
OX


출처

profile
https://github.com/Dingadung

0개의 댓글