대부분의 상황에서 "Sync 와 Blocking" 그리고 "Async 와 Non-Blocking" 은 비슷하게 여겨질 수 있다. 그러나 항상 같은 것은 아니다.
Sync & Async 는 두 모듈의 관계를 묘사하고
Blocking & Non-Blocking 은 한 모듈의 상황을 묘사한다.
아래는 프로세스가 스레드의 작업을 호출했을때의 상황을 예시로 설명해 본 것이다. 실제 예시에서는 두개의 스레드가 될 수도, 두개의 프로세스가 될 수도, 하나의 프로세스와 하나의 스레드가 될 수도 있다.
프로세스가 스레드의 작업을 호출하면 스레드가 작업을 마칠 때 까지 프로세스의 진행이 Block 되는 방식이다.
일반적으로 Java 프로그래밍을 하게 되면 겪게되는 방식이다.
프로세스가 스레드의 작업을 호출하면 스레드에서 결과를 즉시 반환해 줄 수 없을 때 에러(결과없음)를 반환한다. 작업의 결과값을 반환받기 위해서 프로세스는 어떤 방식으로든(ex. polling) 지속적으로 스레드에 read 요청을 보내야 한다. 때문에 리소스의 낭비가 발생할 수 있다.
Async & Blocking 은 결과적으로 Sync & Blocking 과 동일하게 동작한다. 프로세스가 스레드의 작업을 호출하면 스레드는 즉시 결과(결과 요청중)를 반환한다. 하지만 다음 작업을 위해 스레드의 결과값이 필요하므로 Block 되어 결과를 기다린다. 어떤 방식으로든(signal or callback) 스레드로부터 결과값을 받게 되면 그제서야 다음 작업을 실행하게 된다.
프로세스에서 스레드의 작업을 호출하고 계속해서 작업을 진행한다. 작업이 완료되는 시점에 어떤 방식으로든(signal or callback) 스레드로부터 작업의 결과를 받아 응답한다.
주로 JavaScript에서 겪을 수 있는 방식이다.
오류가 있다면 댓글로 지적 부탁드립니다.
Ref.