처음부터 차근차근

[CS 지식] 동기/비동기 & Blocking/Non blocking 본문

CS

[CS 지식] 동기/비동기 & Blocking/Non blocking

HangJu_95 2023. 12. 9. 22:43
728x90

Node.js를 공부하다보면, Node.js는 Non-Blocking이라는 장점을 가지고 있다고 나와있습니다.

또한 Blocking에 항상 같이 나오는 동기/비동기를 정확히 알아야 그 둘의 차이점을 알 수 있습니다.

사실 백엔드 공부를 하면서 비동기가 Non-Blocking인거 아니야?? 이렇게 생각할 수 있지만, 이것은 틀린 생각입니다.

동기/비동기 와 Blocking/Non-blocking 은 다른 것인가??

사실 이 주제는 구글링을 좀만 해 보면 알 수 있습니다.

IBM의 유명한 도표

 

이 도표는 2006년 8월 말 IBM DeveloperWorks Library에 article로 게재된 글 Boost application performance using asynchronous I/O 에서 사용된 도표입니다. 이 도표는 AIO(Asynchronous I/O)를 소개하고 권장하는 글이였습니다.

그런데 이게 어떻게 다른 건지는 자세하게 모릅니다.

 

사실 Node.js를 사용하다보면 우리는 Block & Synchronous 케이스, 그리고 Non-Block & Asynchronous 케이스를 너무 많이 접해봤습니다. 간단한 코드 예시를 보겠습니다.

// 동기적 처리
console.log("1st");
console.log("2nd");
console.log("3rd");

이 코드는 Javascript를 통해 동기적으로 처리한 경우입니다. Javascript는 위에서 아래로 코드를 실행시키기 순차적으로 실행시키기 떄문입니다. 결과는 누가봐도 뻔하게

순서대로 나옵니다.

Javascript에서 순차적으로 Console.log를 실행시켰으니, 순서대로 나오는 것이 당연합니다.

마치 Console.log("1st")가 끝나고 난 다음에, Console.log("2nd") 나오기 때문에 Blocking 된걸로 보이긴 하죠.

 

그렇다면 비동기 함수인 settimeout을 사용하면 어떻게 될까요??

// 비동기적 처리
console.log("1st");
setTimeout(() => {
  console.log("2nd");
}, 0);
console.log("3rd");

setTimeout() 메소드의 첫번째 인자로는 콜백 함수를 사용하였으며, 두번째 인자는 지연시간으로, 지연시간을 0초로 두었습니다.

그래서 예상된 결과로는 1,2,3 동일하게 나와야하지만 아니였습니다.

이렇게 나오는 이유는 Javascript는 싱글 스레드이지만 이벤트 루프에 의해 비동기적 처리가 가능하기 때문입니다.

(비동기는 아래에 포스팅을 보면 자세히 나와 있습니다.)

 

사실 이것만 보면, SetTimeout 함수는 끝날때까지 다른 함수의 실행을 막지 않으니 또 Non-Blocking으로 보이고, 이게 비동기적으로 처리된 것으로 보이기도 하죠.

동기/비동기 와 Blocking/Non-Blocking은 다른 것이다!

사실 이 둘은 서로 다른 차원에서 작업을 수행하는 방식을 설명하는 개념입니다.

저는 프로그래밍의 기본적인 개념에 대해 공부할 때 영어 단어의 원초적인 문자 그대로를 통해 공부합니다.

한번 이 둘도 자세하게 살펴보겠습니다.

Synchronous / Asynchronous

synchronous : 동시에 발생하는 것을 의미

이 뜻만 봤을때는 조금 헷갈릴 수 있습니다.

싱크로나이즈, 같은 시간에 같은 동작을 수행한다.

비슷한 단어로 동기화가 있습니다. 간단한 예시로 제 맥북의 캘린더와 아이폰의 캘린더는 동기화가 되어있습니다. 그리고 맥북에서 캘린더를 업데이트하면 동시에 아이폰도 같이 업데이트 됩니다.

 

그렇다면 프로그래밍 언어에서 Synchronous는 무엇을 동시에 발생하는 것일까요??

프로그래밍에서 어떠한 요청을 하면, 그 결과가 동시에 일어난다는 약속을 의미합니다.

즉, 요청을 하면 시간이 얼마나 걸리던 지 요청한 자리에서 결과가 주어져야 하며, 이러한 이유 때문에 순서에 맞춰서 진행되는 것입니다.

 

그렇다면 Asynchronous는 무엇을 의미할까요??

동시에 일어나지 않는다를 의미하며, 요청한 결과가 동시에 일어나지 않을 것이라는 약속입니다.

즉, 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식을 의미합니다.

 

조금 더 어렵게 설명하자면,

  • 호출된 함수의 수행 결과 및 종료를 호출한 함수가(호출된 함수뿐 아니라 호출한 함수도 함께) 신경 쓰면 Synchronous
  • 호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 신경 쓰고 처리한다면(as a callback fn.) Asynchronous

Blocking / Non-Blocking

배구의 Blocking

Blocking : 행위자가 취한 행위 자체가, 또는 그 행위로 인해 다른 무엇이 막혀버린, 제한된, 대기하는 상태

즉, 단어에서 알 수 있듯이 다른 요청의 작업을 처리하기 위해 현재 작업을 Block(차단, 대기)하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식입니다.

 

이를 통해 정의하자면

Blocking : 특정 작업이 실행 요청을 받아 실제로 수행되는 동안, 다른 작업은 작업을 진행하지 못하고 대기해야만 하는 방식

NonBlocking : 특정 작업이 이미 수행중이라 할 지라도, 그것과는 상관이 없이 바로 다른 작업을 수행 시키는 것이 가능한 방식

 

조금 더 어렵게 설명하자면

  • 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 돌려주지 않으면 Block
  • 호출된 함수가 자신이 할 일을 채 마치지 않았더라도 바로 제어권을 건네주어(return) 호출한 함수가 다른 일을 진행할 수 있도록 해주면 Non-block

동기/비동기 + Blocking/Non-Blocking 조합

그렇다면 동기/비동기 와 Blocking/Non-Blocking을 이렇게 정리할 수도 있습니다.

 

  • 동기/비동기 : 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점
  • Blocking/Non-Blocking : 현재 작업이 Block(차단,대기)되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점

그리고 이것을 통해 4가지 조합으로 나타낼 수 있습니다.

https://inpa.tistory.com/entry/👩%E2%80%8D💻-동기비동기-블로킹논블로킹-개념-정리

이것을 알아보기 위해서 여러 블로그를 찾아봤고, 그 중 정말 설명을 잘해놓은 블로그를 찾았습니다.

https://musma.github.io/2019/04/17/blocking-and-synchronous.html

4가지 캐이스를 대표와 사원을 통해 예시로 나타내었습니다. 

 

Blocking & Synchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 오케이, 잠깐만 거기 계세요!
나 : …?!!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (과정 지켜봄.. 궁금함.. 어차피 내 일 하러는 못 가고 계속 서 있음)

 

Blocking & Asynchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 오케이, 잠깐만 거기 계세요!
나 : …?!!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (안 궁금함.. 지나가는 말로 여쭈었는데 붙잡혀버림.. 딴 생각.. 못 가고 계속 서 있음)

 

Non-blocking & Synchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 알겠습니다. 가서 볼 일 보세요.
나 : 넵!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : 채용하셨나요?
대표님 : 아직요.
나 : 채용하셨나요?
대표님 : 아직요.
나 : 채용하셨나요?
대표님 : 아직요~!!!!!!

 

Non-blocking & Asynchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 알겠습니다. 가서 볼 일 보세요.
나 : 넵!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (열일중..)
대표님 : 한 분 모시기로 했습니다~!
나 : 😍

참고

https://iceflower.gitbooks.io/vertx-studybook/content/thread-safe.html

 

👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

동기/비동기 & 블로킹/논블록킹 프로그래밍에서 웹 서버 혹은 입출력(I/O)을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이러한 용어들을 접해본 경험이 한번 쯤은 있을 것이다. 대부분 사람들은

inpa.tistory.com

 

동기와 비동기의 개념과 차이

1. 동기(Synchronous: 동시에 일어나는) - 동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그 결과가 동시에 일어난다는 약속이다. 바로 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서

dev-coco.tistory.com

 

동기(Synchronous)는 정확히 무엇을 의미하는걸까?

이번 포스팅에서는 I/O와 네트워크 등 전반적으로 다양한 모델에서 사용하는 개념인 가 정확히 무엇을 의미하는 것인지, 그리고 동기 방식과 비동기 방식의 차이에 대해서 한번 이야기 해보려고

evan-moon.github.io

 

동기와 비동기, 그리고 블럭과 넌블럭

무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비

musma.github.io