동기(Synchronous) 와 블로킹(Blocking), 비동기(Asynchronous) 와 논블로킹(NonBlocking)은 의미적으로 비슷할 수 있지만 전혀 다른곳에서 사용되며 직접적인 관련은 없다.
동기와 비동기는 프로세스의 수행 순서에 대한 매커니즘이고
블로킹과 논블로킹은 프로세스의 유휴 상태에 대한 개념이다.
동기(Synchronous)
동기라는 단어처럼 동시에 일어나는 작업이다. 요청과 그 결과가 동시에 일어나는데
요청을 하고 그 결과가 돌아왔을 때 다음 작업을 진행할 수 있다. A 작업이 완전히 종료된 후에
B 작업을 진행할 수 있다.
아래와 같은 예시가 있다.
예상 결과는 '1 - a 작업', '2 - b 작업', '3 - c 작업' 이다.
예상 결과랑 맞게 나왔다. 동기적 작업은 순서대로 결과값이 나온다.
비동기(Nonsynchronous)
비동기는 동기와 다르게 A 요청을 보냈을 때 완료될때 까지 기다리지 않고 B 작업을 수행한다.
B 작업 수행 도중에 A 요청이 완료가 됐을 때 출력한다.
아래 예시를 보자
위 이미지를 보면 예상 결과는 '1 - a 작업', '2 - b 작업', '3 - c 작업' 처럼 나올거라고 생각하지만 아니다.
예상한것과 달리 1 작업, 3작업, 2작업 순서로 나왔다.
이유는 setTimeout() 메소드가 비동기적 API 이기 때문에 비동기적으로 요청에 따라 바로 결과가 실행되지 않는다.
'1 - a작업' 을 출력한 후 setTimeout에 의해 비동기 요청을 하고 결과를 기다리지 않고 바로 '3 - c 작업' 을 출력한다.
그 후에 setTimeout() 메소드가 완료됐을 때 '2 - b 작업' 을 출력하는거다.
동기 방식은 비동기 방식보다 설계가 간단하고 직관적이지만 결과가 반환될 때까지 아무것도 못하고
대기해야 하는 단점이 있다.
비동기 방식은 동기 방식보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간동안
다른 작업을 진행할 수 있어 효과적으로 자원을 사용할 수 있는 장점이 있다.
블로킹(Blocking) & 논블로킹(Non-Blocking)
처리되어야 하는 작업이 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점
즉, 제어권이 누구한테 있느냐가 중요하다.
* 제어권 : 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 끝까지 코드를 실행한 후
호출한 함수에게 돌려준다.
블로킹(Blocking)
블로킹은 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 자신의 작업을 중지하고
다른 작업이 끝날때 까지 기달렸다가 자신의 작업을 시작한다.
즉, 가지고 있던 제어권을 다른 주체에게 넘겨주고 다시 돌려받을때 까지 작업을 수행하지 못한다.
1. A 함수가 실행되면서 B 함수를 호출한다.
2. A 함수의 제어권을 B 함수에게 넘긴다.
3. 제어권을 넘겨받은 B 함수는 작업을 수행하고 제어권이 없는 A 함수는 작업을 중지한다.
4. B 함수는 모든 작업이 종료되면 A 함수에게 제어권을 돌려준다.
5. 제어권을 돌려받은 A 함수는 다시 작업을 진행한다.
논블로킹(Non-Blocking)
다른 주체의 작업과 관련없이 자신의 작업을 수행한다.
1. A 함수를 실행하면서 B 함수를 호출한다.
2. 제어권은 그대로 A 함수가 가지고 있으면서 B 함수를 실행한다.
3. A 함수는 제어권을 그대로 가지고 있기 때문에 B 함수를 실행과 동시에 자기 자신의 작업도 수행한다.