Blocking vs Non-Blocking vs Synchronous vs Asynchronous

@VERO
Created Date · 2024년 03월 25일 06:03
Read Time · 6 min read
Last Update · 2024년 03월 25일 06:03

Blocking

  • 특정 작업을 수행할 때 해당 작업이 완료될 떄까지 호출한 프로세스 (또는 스레드)가 대기 상태에 놓이는 것
  • 블로킹 작업 중에는 해당 프로세스가 다른 작업을 수행할 수 없다.

Non-Blocking

  • 작업을 요청했을 때 해당 요청이 즉시 완료되지 않더라도 호출한 프로세스가 대기하지 않고 즉시 실행을 계속할 수 있음을 의미한다.
  • 결과는 나중에 확인되거나, 다른 방식 (콜백 등) 으로 전달된다.

Synchronous

  • 동기 방식에서는 작업들이 순서대로 실행된다. 한 작업의 완료 후 다음 작업이 시작된다.
  • 결과는 바로 반환되며, 호출된 프로세스는 각 작업의 완료를 기다린다.

Asynchronous

  • 여러 작업이 동시에 실행될 수 있다. 한 작업의 완료를 기다리지 않고 다음 작업을 시작할 수 있다.
  • 작업 완료와 결과는 나중에 알림 (콜백, 프로미스, 이벤트 리스너)을 통해 전달된다.

Blocking Synchronous

작업 요청이 끝날 떄까지 프로그램의 실행이 정지되며, 요청한 작업이 완료된 후에야 다음 작업으로 넘어간다. 작업 처리 과정에서 프로그램은 대기 상태에 있으며, 이후의 작업들은 이전 작업이 완료될 때까지 실행되지 않는다.

ex. 파일 시스템에서 파일을 읽는 작업을 요청하고, 파일의 모든 내용이 읽혀질 때까지 기다린 후, 파일 내용을 메모리에 저장하고 출력하는 프로그램

Blocking Asynchronous

(일반적이지 않음)
블로킹이지만 비동기적 요소를 포함할 수 있는 특별한 상황을 가리킨다. 메인 작업이 대기 상태에 있지만, 백그라운드에서 비동기적으로 여러 작업이 진행되는 경우를 말할 수 있다.

ex. GUI 애플리케이션에서 메인 UI 스레드가 사용자 입력을 기다리는 동안(블로킹), 백그라운드 스레드에서 비동기적으로 데이터를 다운로드 받는 경우를 생각할 수 있다. 메인 스레드는 블로킹되지만, 백그라운드 작업은 비동기적으로 진행된다.

Non-Blocking Synchronous

작업 요청이 즉시 반환되며, 호출자는 결과가 준비되지 않았다면 다시 시도해야 한다. 작업 완료를 기다리는 대신, 주기적으로 작업의 완료 여부를 폴링한다.

ex. 데이터베이스 쿼리를 보내고, 즉시 응답을 받는다. 그러나 응답에 데이터가 없다면, 일정 시간 후 다시 쿼리를 보내 결과가 준비되었는지 확인한다. 이 과정을 결과를 얻을 때까지 반복한다.

Non-Blocking Asynchronous

작업 요청이 즉시 반환되고, 작업의 완료와 결과는 콜백, 프로미스, 이벤트 리스너 등을 통해 비동기적으로 처리된다. 호출자는 다른 작업을 계속 수행할 수 있으며, 특정 작업이 완료되면 그에 대한 알림을 받는다.

ex. 웹 서버에서 클라이언트의 HTTP 요청을 처리하는 경우, 서버는 각 클라이언트 요청을 즉시 수락하고, 요청 처리는 비동기적으로 수행된다. 각 요청이 처리되면, 결과는 비동기적으로 클라이언트에게 전송된다. 서버는 이 과정에서 다른 클라이언트의 추가 요청을 계속 받을 수 있다.

Blocking & Non-Blocking

이 개념들은 호출된 작업이 호출자의 실행 흐름을 어떻게 다루는지에 대해 초점을 맞춘다. Blocking 은 호출된 작업이 완료될 때까지 호출자의 실행 흐름을 대기 상태로 만들고, Non-blocking 은 호출된 작업이 즉시 반환되어, 호출자가 대기 없이 다른 작업을 계속할 수 있도록 한다.

Synchronous & Asynchronous

이 개념들은 작업의 완료가 어떻게 전달되는지에 대한 것이다. Synchronous 방식에서는 작업의 결과나 완료가 바로 반환되며, 작업 처리가 순차적이다. Asynchronous 방식에서는 작업이 백그라운드에서 수행되며, 완료 시 콜백, 이벤트, 프로미스 등을 통해 결과가 반환된다.

참고

  • Non-blocking 방식은 시스템의 응답성을 높일 수 있지만, 반드시 비동기적일 필요는 없다. Non-blocking Synchronous 방식은 polling 이나 반복 확인을 통해 작업 완료를 확인할 수 있다.