SERVER/Node.js

Block IO vs Non-Block IO & Sync vs Async

완자✨ 2022. 6. 28. 15:33

Block IO vs Non-Block IO & Sync vs Async

IO란?

IO는 데이터의 입력(Input)과 출력(Output)을 함께 일컫는 말이다.

어떤 데이터가 CPU에서 처리되기 위해서는 자신이 있는 위치부터 메모리 계층의 최상위에 있는 레지스터까지 전달되어야 한다. 몇몇 데이터 소스는 실행을 심각하게 늦추지 않는 선에서 레지스터까지의 데이터 전달을 보장한다. 하지만 대부분의 데이터 소스는 데이터를 요청했을 때 일정 시간 안에 데이터를 받을 수 있을 거라는 보장이 없기 때문에, 프로그램은 어떤 방식으로든 데이터를 받기까지 실행이 심각하게 늦춰진다고 느껴질 만큼 대기하는 시간이 생긴다.

Blocking IO

블로킹 IO는 IO 작업시 프로그램의 실행을 막는다는 뜻으로 해석될 수 있다.

  • 2개 이상의 작업이 있을 때 한 작업이 다른 작업이 종료될 때까지 본인의 작업을 진행할 수 있는가에 대한 개념이다. 보통 직접 제어할 수 없는 I/O, 멀티스레드 동기화 등에 적용되는 개념이다.
  • 제어권이라는 것은 함수를 실행할 수 있는지를 의미한다.
  • Blocking은 함수 A의 작업 도중 함수 B를 호출하는 경우 B의 작업이 끝날 때까지 A는 작업을 할 수 없다. 제어권의 개념으로 보면, 제어권이 A에 있다가 B를 호출할 때 B로 제어권이 이동한다. A는 제어권이 없으므로 나머지 로직을 실행하기 위해서 B의 작업이 끝나 제어권이 A로 돌아올 때까지 기다려야 한다.

Non-Blocking IO

Non-Blocking은 A의 작업 도중 B를 호출한 후 B의 작업과 상관없이 A의 나머지 작업을 수행하는 것입니다.

  • 이 경우 제어권은 B에게 넘어가도 B는 즉시 결과를 return하여 A에게 제어권을 돌려줍니다.
  • 즉시 넘어노는 결과에는 "완료되지 않았다는 값"을 담아서 반환합니다.

Sync

Sync / Async 작업을 수행하는 두 주체가 서로의 작업의 시작/완료 여부를 확인해야 하는가에 대한 개념이다.

  • 더 정확히는 작업을 요청한 측(A)에서 요청한 작업(B)의 완료여부를 확인하면 동기, 그렇지 않으면 비동기이다.
  • 동기 작업은 다수의 작업의 주체들이 서로 동시에 시작하거나, 끝나거나 혹은 끝나는 동시에 시작하는 경우이다.
  • A함수에서 B함수를 호출했을 때 B함수의 완료여부를 A가 기다리거나 B의 작업 완료 여부를 계속 확인한다면 동기이다.

Async

  • 비동기 작업은 다수의 작업의 주체들이 서로의 작업의 시작/완료 시간과 상관없이 별도로 작업을 시작하고 종료하는 경우이다.
  • 예를 들어 A가 B함수를 호출하면서 콜백함수를 함께 전달하여 B의 작업 완료와 상관없이 자신의 작업을 계속해나가는 것이다.

blocking vs non-blocking

  • blocking/non-blocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사이다.
  • blocking: 바로 리턴 하지 않는다. 함수의 작업이 모두 완료되었을 때 결과와 함께 제어권을 넘긴다.
  • non-blocking: 호출 즉시 결과를 리턴하는 동시에 제어권도 함께 넘긴다.

sync vs async

  • sync/async는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심사
  • 동기(sync): 호출되는 함수의 작업 완료 여부를, 호출 하는 함수가 신경씀.
  • 비동기(async): 호출되는 함수의 작업 완료 여부를, 호출 되는 함수가 신경씀.

1. Sync Blocking

동기 블로킹은 작업들의 시작 시간, 종료 시간이 서로 영향을 받으면서 + 다른 작업을 하는 동안 자신의 작업을 중지해야하는 경우이다. 대부분의 함수 호출이 이에 속한다.

2. Sync Non-blocking

동기 논블로킹은 작업들의 시작 시간, 종료시간이 서로 영향을 받으면서 + 다른 작업이 끝나기를 기다리지 않는 경우이다. A작업이 자신의 작업을 수행하면서 B작업이 완료여부를 지속적으로 확인하는 경우가 이에 속한다. 함수B의 작업이 완료되었는지 함수A가 지속적으로 물어본다.

3. Async Blocking

비동기 블로킹은 작업들이 서로의 시작/종료 시간에 관심이 없고 + 다른 작업을 하는 동안 자신의 작업을 중지해야하는 경우이다. 이런 경우에는 동기 블로킹보다 오히려 더 오랜 작업시간이 걸릴 수 있습니다.

4. Async Non-Blocking

비동기 논블로킹은 작업들이 서로의 시작/종료 시간에 관심이 없고 + 다른 작업이 끝나기를 기다리지 않는 경우이다. 예를 들어 비동기 함수를 호출하며 콜백함수를 함께 전달하는 경우가 이에 속한다.

'SERVER > Node.js' 카테고리의 다른 글

💻Node.js의 논 블로킹 IO, 싱글스레드, 이벤트 루프  (0) 2022.06.29
💻 webRTC Process  (0) 2022.06.22
📌동시성과 병렬성  (0) 2022.06.11
📌Observer Pattern이란?  (0) 2022.05.11
SOA, MSA 아키텍처란?  (0) 2022.05.10