Byeongin Yoon
4 min readSep 13, 2018

[NodeJS] Blocking vs Non-Blocking

사전지식

  1. I/O관련 작업은 OS와 I/O Device가 알아서 처리를 해주기 때문에, CPU가 할일이 별로 없다

Blocking

Javascript코드를 한줄 한줄 실행하다가, I/O관련 작업이나 네트워크 통신을 하는 코드를 CPU(NodeJS의 single-thread에 할당된 CPU자원)가 만났을때, OS에게 그 일을 맡긴다. 그리고 CPU는 잠시 일을 쉬면서 결과를 기다린다. 그러다가 OS로 부터 일이 끝났다는 신호를 받으면, 바로 다음 Javascript코드를 한줄씩 읽기 시작한다. 이때 CPU가 잠깐 쉬면서 신호를 기다리는상태를 Blocking이라고 한다.

from : https://www.slideshare.net/ThomasMeijers1/building-a-nonblocking-rest-api-in-less-than-30-minutes

예를들어

blocking test code

위 예제에서, CPU는 1,2번째줄 까지는 잘 실행하다가, 3번째 줄에서 OS한테 test.txt를 읽어들이라는 명령을 내린다. 그리고 CPU는 응답을 기다린다. 그러다가 OS가 일을 다 끝내면, CPU가 data에 값을 담고, 4번째 줄을 실행한다.

Non-Blocking

CPU를 쉬게 냅두지 않는다. I/O관련 작업이나 네트워크 통신 관련 일을 하라는 코드를 만났을때, OS에게 일을 맡기고, 다시 자기가 하던 일을 한다 . 대신, 맡긴 일이 끝났을때 OS가 일이 끝났다는것을 CPU에게 알리도록 설정한다. 이런 방식으로 CPU는 일을 쉬지않고 할 수 있게 된다.

from : https://www.slideshare.net/ThomasMeijers1/building-a-nonblocking-rest-api-in-less-than-30-minutes

예를들어

NodeJS에서는 Non-Blocking 방식으로 일을 처리하기 위해서 Event-Loop와 Event-Queue를 만들어 사용한다. CPU는 OS에게 “너 일 끝나면, ~~~이 코드블락(callback function)을 Event-Queue안에 넣어” 라고 말하면서 일을 시키고, 그 queue를 계속 감시하면서 뭐가 들어있으면 해당 코드를 실행시킨다. Event-Loop에 관한 자세한 이야기는 다음 포스트에서 자세하게 다룰 예정이다.

부연 설명

이글에서 말하는 CPU라는건 NodeJS가 single-thread를 돌리는데 운영체제로부터 할당받은 CPU자원을 의미한다. 또한, I/O 관련 작업 이나 네트워킹등의 일들을 OS에게 시킨다고 했는데, 항상 OS에게만 일을 시키는것은 아니며, C++로 작성된 libuv라는 라이브러리한테도 일을 시키기도 한다. 대표적인 예로, 긴~암호를 생성하는 NodeJS의 crypto모듈의 pbkdf2()라는 함수는 내부적으로 libuv라이브러리의 PBKDF2()함수를 사용하며, 이 긴~암호를 생성하는 일을 비동기적으로 처리하기위해서 libuv는 자신이 할당받은 몇개의 thread중 하나를 사용한다

참고자료

  1. Basics of OS (I/O Structure)
  2. NodeJS Document - 블로킹과 논블로킹 살펴보기
  3. Udemy Lecture — NodeJS: Advanced Concepts

읽어주셔서 감사합니다.

제가 잘못 알고 있는 부분이 있으면 알려주시기 바랍니다.