Blocking , Non-Blocking VS Synchronous, Asynchronous
자바스크립트는 Non-Blocking 방식으로 작동하는 언어로서 ....
자바스크립트의 이점은 비동기(Asynchronous) I/O 에서 ....
언뜻 보면 굉장히 비슷한 개념인 것 같기도 하고, 그다지 신경쓰지 않고 넘어가게 되는 부분이다. 일반적인 경우에서는 블로킹 == 동기 , 논블로킹 == 비동기 라고 표현을 해도 사실 커뮤니케이션에 큰 문제는 생기지 않는다. 면접 질문에서 위와 같은 맥락의 질문을 받아 적잖이 당황하고, 조금 늦었지만 이제라도 확실히 알아가고자 여러 자료를 찾아보았다. 그림 으로 이해하는 데에는 이 자료 , 개념 자체를 이해하는 데에는 이 자료 가 많이 도움이 되었다. (감사합니다 🙏)
이곳저곳 설명하는 곳을 보니, 이게 뭐고, 이게 뭐다 라고 정확하게 구분되는 개념이 아니라, 서로 독립적으로 바라보면서 해석해야 한다고 한다.
아래와 같이 한 눈으로 보기 좋은 만들어진 표들이 있어서 첨부한다!
Blocking , Non-Blocking ❓
Blocking 과 Non-Blocking 은, '제어권' 관점에서 접근하는 방식이다.
설명을 하기 쉽게 호출된 함수와 호출한 함수 두 함수 관점에서 바라보겠다.
Blocking이라는 것은 한국어로 '막혀 있다' 라는 뜻이다. 즉, 호출된 함수가 제어권을 넘겨주지 않아, 호출한 함수측에서는 다른 작업을 수행할 수 없이 제어권이 돌아오기를 기다리는 것을 말한다. 그에 반해, Non-Blocking은, 제어권이 넘겨 지지 않으므로, 대상의 작업 처리 여부와 상관이 없이 호출한 함수 측에서 제어권을 가지고 다음 작업들을 수행할 수 있다.
즉, Non-Blocking 으로 이루어진다는 것은, 제어권은 호출한 함수 측에서 계속해서 가지고 있기 때문에, 만약에 다른 함수가 실행된다면 그 함수에 대한 결과값을 받을 수 있는 상황인지 체크하는 과정이 필요한 것이다. 이러한 맥락에서 JS 에서는 이벤트 루프가 돌아가면서 그런 과정을 도맡아 주는 것으로 이해했다.
Synchronous, Asynchronous ❓
Blocking 은 '제어권' 의 관점으로 바라보았다면, Synchronous, 는 서로 '시간' 관점에서 접근해야 한다.
설명을 하기 쉽게 호출된 함수와 호출한 함수 두 함수 관점에서 바라보겠다.
Synchronous 는 두 함수의 시작과 종료 시간에 대해 맞춰져야한다는 뜻이다. 스택에서 함수 하나가 빠져 나가고, 다음 함수가 실행이 되고, 이런 느낌으로 시간이 지켜지면서 순차적으로 일어날 수 있는 것을 의미한다. 실제로 한국어로 동기화 또한 그런 맥락에서 들어맞기 때문에 이해하는 데에 도움이 되었다.
Asynchronous 는 당연히 Synchronous 와 반대로, 두 함수의 시작과 종료 시간이 완전히 맞춰지지가 않는다는 뜻이다. 호출한 함수는 호출된 함수의 결과를 기다리지만, 제어권이 어떻게 될지는 관심이 없다. 비동기적으로 다른 함수가 실행이 된다는 데에 의미가 있고 호출된 함수의 결과값을 받게 되는데 다른 비동기 함수로 부터 받은 결과값에 대해 모든 순서가 완전히 보장이 될 수눈 없다는 의미이다. Ajax 가 대표적인 그 예시이다.
두 개념의 혼합?
일반적인 케이스는 (blocking + synchronous), (non-blocking + asynchronous) 가 함께 작동하는 경우 들이다. 이 경우에 대한 예는 간단하고 일반적인 케이스라 생략하겠다.
난해하고 이해하기가 쉽지 않은 경우는 (non-blocking + synchronous), (blocking + asynchronous) 의 경우다!
앞서 말했던 관점에 유의하면서 천천히 해석해보면 이해가 가능하다.
Non-blocking + Synchronous
제어권을 호출된 함수에게 넘겨주지 않는다 (Non-blocking)
But, 함수 결과값의 순서는 보장된다 (Synchronous)
여기서 핵심은, 제어권을 호출된 함수에게 넘겨주지 않기 때문에 (Non-blocking적인 특성), 프로그램 측에서는 호출한 함수가 끝나기를 기다리면서 다른 작업들을 수행할 수가 있다는 뜻이다. 하지만 Synhronous하기 때문에, 시간을 맞춰주기 위해 매 시간 호출된 함수가 끝났는지 테스팅하는 요청이 필요하다.
Blocking + Asynchronous
제어권을 호출된 함수에게 넘겨주게 된다 (Blocking)
But, 함수 결과값의 순서는 보장되지 않고 결과를 바탕으로 이루어진다 (Asynchronous)
호출한 함수는 제어권을 호출된 함수에게 넘겨주어버렸으므로, 다른 작업들을 할 수가 없게 된다. 호출된 함수에 대한 결과값의 응답을 받은 후, 제어권 또한 넘겨받게 되어 다른 작업들이 실행된다. 언뜻 보면 그럼 왜 굳이 Asnyc? 라는 생각이 들 수 밖에 없다. 실제로도 이런 케이스는 비효율적이기 때문에 직접적으로 사용하는 모델은 거의 없다고 하고, 환경이 다른 두 프로그램을 혼합에서 사용하면서 겪게 되는 희귀한 경우 (예 : Node.js와 MySQL을 함께 사용하는 경우) 라고 한다.
기타
- 한국 사람들은 Async 를 보통 '어싱크' 라고 발음하는데 '에이싱크' 가 맞는 말이다. 해외 유튜버들도 다들 그렇게 발음하고, 구글 사전에 쳐서 발음을 들어봐도 '에이싱크로너스' 로 발음한다😗
- 사실 (Sync+Non-bloking) 이나 (Async+Blocking) 케이스 처럼 두 개념을 혼합해서 무슨 차이가 있을까 를 이해하는 것 보다는, 각각의 (Sync & Async) 혹은 (Bloking & Non-blocking) 이 어떤 관점, 어떤 맥락을 가지고 있는지 대한 이해가 중요하다고 생각한다. 이 관점에 대한 차이를 이해하면 자연스레 두 케이스를 구분할 수 있게 될 뿐만 아니라, 실제로도 저 두 케이스가 어떻게 다른지 구분해야되는 특이한 상황이 벌어질 일은 거의 없다고 본다.
참고
- https://geonlee.tistory.com/138
- https://ooeunz.tistory.com/89
- https://www.youtube.com/watch?v=IdpkfygWIMk
- https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx
- https://velog.io/@hotdari90/Async-Sync-Blocking-Non-Blocking
- https://musma.github.io/2019/04/17/blocking-and-synchronous.html
'컴퓨터 지식' 카테고리의 다른 글
소프트웨어 설계에 대해 ⭐ / 2️⃣ - 시각화와 모델링 (Feat.UML, PUML, draw.io) (0) | 2022.01.01 |
---|---|
소프트웨어 설계에 대해 ⭐ / 1️⃣ - 설계의 중요성과 디자인 패턴 (feat. patterns) (0) | 2021.12.23 |
[컴퓨터구조] Locality 란 / Locality 종류 (0) | 2019.12.05 |
댓글