동기와 비동기, 블로킹과 논블로킹
동기/비동기는 “결과 반환 시점”에 대한 개념이고,
블로킹/논블로킹은 “Thread가 그 사이에 대기하는가”에 대한 개념으로 볼 수 있다.
동기(Synchronous) vs. 비동기(Asynchronous)
동기 (Synchronous)
동기 방식에서는 하나의 작업이 완전히 끝난 후에야 다음 작업을 실행한다. 즉, 이전 작업이 완료될 때까지 기다리기 때문에 호출한 측은 결과가 돌아올 때까지 “멈춘”상태가 된다.
비동기 (Asynchronous)
비동기 방식에서는 작업을 시작한 후, 그 작업이 완료될 때까지 기다리지 않고 바로 다음 작업을 수행할 수 있다. 작업이 완료되면 별도의 콜백이나
await
를 통해 결과를 처리할 수 있다. 이를 통해 응용 프로그램은 작업이 진행되는 동안에도 다른 작업을 수행할 수 있어 효율적인 리소스 활용과 응답성 향상이 가능하다.
블로킹(Blocking) vs. 논블로킹(Non-Blocking)
블로킹 (Blocking)
블로킹 작업은 작업이 완료될 때까지 현재 스레드를 “멈추게” 한다. 예를 들어, 동기 메서드 내에서 I/O 작업(파일 읽기, 네트워크 요청 등)을 수행할 때 해당 작업이 끝날 때까지 스레드는 다른 작업을 할 수 없다.
논블로킹 (Non-Blocking)
논블로킹 작업은 작업이 진행되는 동안에도 현재 스레드가 다른 일을 수행할 수 있도록 한다. 비동기 프로그래밍은 보통 논블로킹 방식으로 구현되며, I/O 작업을 호출한 스레드가 다른 일을 할 수 있도록 하여 애플리케이션의 전체적인 응답성을 높인다.
비동기(asynchronous)와 논블로킹(non-blocking)은 밀접한 관계가 있지만 동일한 개념은 아니다. 예를 들어, 비동기 작업이 내부적으로 스레드를 블로킹할 수도 있으나, 일반적으로 .NET의
async/await
패턴은 논블로킹 방식으로 I/O 작업을 수행한다.