동기와 비동기

동기

한 작업이 다른 작업에 종속되어 순차적으로 실행되는 개념

  • 프로그램이 실행 될 때, 한 작업이 완료되고 나서야 다음 작업이 실행된다면 동기적인 것이다.
  • 작업(코드)의 순서가 곧 실행 순서이다.

동기는 실행 순서가 보장되어 있다.

비동기

한 작업의 완료를 기다리지 않고, 다른 작업을 동시에 실행하도록 하는 프로그래밍 개념

  • 비동기적인 코드는 작업이 완료될 때까지 대기하지 않고, 다른 작업을 계속해서 진행한다.
  • 처리에 오랜 시간이 걸리는 작업(네트워크 통신, 파일 입출력, 웹 요청 등)이 존재할 시, 다른 작업을 실행함으로 효율적인 작업처리에 도움을 준다.
  • 작업(코드)의 순서와 실행의 순서가 다를 수 있다.

동기는 실행 순서가 보장되어 있지 않다.

실행 순서가 보장되어 있다?

프로그래밍에서의 실행은 작업의 시작, 진행, 완료까지의 전 단계를 의미하지, 작업의 시작만을 의미하지 않는다.
다시 말해 실행 순서가 보장된다는 말은 하나의 실행 단위가 시작 부터 완료까지 진행이 되고 나서야 다음 프로그램이 실행된다는 뜻이다.

만약 JavaScript와 같이 싱글 스레드 환경이라면 비동기작업이라도 동시에 수행되지 않는다.
다만, javaScript의 비동기 함수들은 서버에 요청을 보내는 등, 자신이 직접 처리하는 일이 아닌 외부에 작업을 요청하고 결과를 받기만 하는 경우이므로 싱글 스레드 환경임에도 비동기 작업을 효율적으로 처리할 수 있다.

 

비동기는 작업의 동시 수행을 의미할까?

직렬과 병렬, 동기와 비동기의 개념은 비슷하게 들리겠지만 다음과 같은 차이점이 있다.
직렬, 병렬 개념은 실행 방식에 대한 개념, 동기와 비동기는 작업의 진행 방식에 대한 개념이다.
더 쉽게 설명하자면, 직렬과 병렬은 작업이 순차적으로 실행되는지,  동시에 실행되는지에 관한 것이다.
동기와 비동기는 실행(작업의 시작, 진행, 완료)이 하나의 묶음으로 이루어지는지 아닌지에 관한 것이다.

직렬적이면서 비동기적인 작업
작업 A, B가 있다. 각 작업은 시작, 진행, 완료의 단계로 이루어져있다. 작업 A가 먼저 시작된다. 하지만 작업 A의 진행은 오랜 시간이 걸린다. 따라서 효율적인 처리를 위해 작업 A의 진행을 뒤로 미뤄 두고 작업 B를 시작한다. 작업 B가 진행 및 완료가 된 뒤, 미루어 두었던 작업 A의 진행이 이루어진다.

결국 비동기란 작업의 동시 수행이 아닌, 먼저 시작된 작업의 결과를 기다리지 않고 다른 작업을 처리하는 것을 뜻한다.

 

그러나 병렬과 비동기 그리고 직렬과 동기는 혼용되는 때가 많아 굳이 엄격하게 구분하지 않아도 된다.
비동기 작업이 여러 작업이 동시에 실행될 수 있는 환경(병렬적 실행 환경)을 제공하기 때문에, 현실적인 맥락에서 종종 두 가지 개념을 비슷한 뜻으로 사용하기 때문이다.

이미지 출처: What every programmer should know about Synchronous vs. Asynchronous Code

비동기 작업에서는 여러 작업(요청)을 처리할 환경이 만들어진다.
작업 간의 의존성이 없고, 요청을 처리할 충분한 자원이 있다면 작업은 병렬적으로 실행된다.

 

블록과 논블록

블록과 논블록은 자주 동기와 비동기와 함께 사용되는 용어이다.

 

블록

작업의 완료를 기다리며, 작업이 끝날 때까지 다른 작업을 수행하지 않는 방식을 의미한다.

  • 작업이 끝날 때까지 기다리는 상태
  • 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 제어권을 반환하지 않음
  • 주로 동기적 호출에서 발생

논블록

작업의 완료를 기다리지 않고, 계속해서 다른 작업을 수행할 수 있는 방식을 뜻한다.

  • 호출된 함수가 자신이 할 일을 마치지 않았더라도 바로 제어권을 바로 반환하여 호출한 함수가 다른 일을 진행 가능
  • 주로 비동기적 호출에서 발생

동기 & 비동기와 블록&논블록의 조합

블록 + 동기

  • 하나의 작업이 시작, 진행, 완료될 때까지 제어권을 가지면서 다른 작업이 수행되지 않는다.
  • 하나의 작업이 실행되어야 다른 작업을 시작할 수 있을 때 사용

논블록 + 비동기

  • 하나의 작업이 실행중인 동안 다른 작업을 실행할 수 있도록 제어권을 놓아준다.
  • 작업의 동시성(병렬성)을 확보할 수 있다.
  • 웹 요청 등, 작업을 동시에 수행하여 효율적인 처리를 위해 사용

논블록 + 동기

  • 실행 중인 작업이 완료될 때까지 다른 작업을 수행하지 않지만 제어권은 실행 중인 작업이 가지고 있지 않다.
  • 따라서 작업의 실행상태를 계속해서 확인하게 된다.
  • 현재 진행 중인 작업의 진행 상태를 확인할 필요가 있을 때 사용

블록 + 비동기

  • 하나의 작업이 실행 중인 동안 다른 작업을 수행할 수 있지만 실행 중인 작업이 제어권을 가져 다른 작업을 할 수가 없다.
  • 비동기적이지만 작업이 동시에 수행되지 않는다.
  • 의도적으로는 사용하지 않는 방법

참고

[10분 테코톡] 🐰 멍토의 Blocking vs Non-Blocking, Sync vs Async

What every programmer should know about Synchronous vs. Asynchronous Code

+ Recent posts