Synchronous( 동기 ) & Asynchronous( 비동기 )
동기와 비동기를 나누는 관점은 처리해야 할 작업들을 어떠한 '흐름'으로 처리 할 것인지에 대한 내용이다.
흐름 즉, 호출되는 함수의 작업 완료 여부를 신경쓰냐에 따라 함수 실행/리턴이 순차적인지 아닌지에 관점을 두고 있다.
-
Synchronous( 동기 ) : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작.
-
Asynchronous( 비동기 ) : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않는다.
![](https://velog.velcdn.com/images/dymnam/post/18611389-df10-41f3-a62a-e3193182308b/image.png)
Synchronous( 동기 )
![](https://velog.velcdn.com/images/dymnam/post/76d6f65e-a5ae-4e8d-bd05-13e726f4ce7e/image.png)
- 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
- A함수에서 B함수를 요청하면, 호출된 B함수의 리턴 값을 상시로 확인한다.
- 작업이 완료 되는지의 여부를 수시로 확인한다.
Asynchronous( 비동기 )
![](https://velog.velcdn.com/images/dymnam/post/1f491b97-3ff0-4a13-a297-68648826fc53/image.png)
- 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 결과를 기다리지 않으며, 다른 함수( CallBack )에서 결과를 처리한다.
- 작업 완료 여부를 확인하지 않는다.
Blocking & Non-Blocking
블로킹과 논블로킹을 나누는 관점은 처리되어야 하는 하나의 작업이 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점이다.
즉, 제어권이 누구한테 있냐가 관심사이다.
-
Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것.
-
Non-Blocking : 다른 주체의 작업에 관련이 없이 자신의 작업을 하는 것.
-
제어권 : 함수의 코드를 실행 할 권리 같은 것으로, 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
Blocking
![](https://velog.velcdn.com/images/dymnam/post/b18bfbfd-7da6-4332-b965-8fd365455030/image.png)
A함수가 B함수를 호출하면, 제어권을 A가 호출한 B함수에 넘겨준다.
- 제어권이 호출된 함수에게 넘어가면서 호출된 함수 내에서 작업이 모두 끝난 후, 호출한 함수에게 다시 제어권이 넘어온다.
- 작업이 완료된 후 새로운 작업을 수행할 수 있다.
Non-Blocking
![](https://velog.velcdn.com/images/dymnam/post/5cd52e24-3eff-420a-93e8-b0b35d136b88/image.png)
A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.
- 제어권이 계속 호출한 함수에 있기 때문에 작업의 완료여부와 관계없이 새로운 작업을 수행할 수 있는 특징을 갖고 있다.
Synchronous( 동기 ) + Blocking
![](https://velog.velcdn.com/images/dymnam/post/b7abe2c7-5e75-4a1d-98e8-f91efdb011fe/image.png)
- 가장 많이 쓰이는 조합 중 하나이다.
- 모든 실행과 흐름이 순차적이기 때문에 개발자가 프로그램을 제어하기 쉽다.
- 블로킹 방식으로 하위 프로세스의 작업이 완료되지 않으면 상위 프로세스는 다른 작업을 할 수 없다.
Synchronous( 동기 ) + Non-Blocking
![](https://velog.velcdn.com/images/dymnam/post/79bd3b11-5708-4d0b-9b76-72bc9ebb03af/image.png)
- 동기 방식으로 상위 프로세스는 하위 프로세스의 작업 완료 여부에 신경을 쓴다.
- 논블로킹 방식으로 작업 완료 여부와 상관없이 상위 프로세스는 다른 작업을 할 수 있다.
Asynchronous( 비동기 ) + Non-Blocking
![](https://velog.velcdn.com/images/dymnam/post/1d11ff0a-894f-4b75-8e86-272b854be505/image.png)
- 가장 많이 쓰이는 조합 중 하나이다.
- 성능과 자원의 효율면에서 가장 우수하다.
- 상위 프로세스는 하위 프로세스의 작업 완료 여부를 신경쓰지 않는다.
- 하위 프로세스의 작업 완료 여부와 관계 없이 상위 프로세스는 다른 작업을 할 수 있다.
Asynchronous( 비동기 ) + Blocking
- 상위 프로세스는 하위 프로세스의 작업 완료 여부를 신경쓰지 않는다.
- 블로킹 방식이므로 하위 프로세스의 작업이 완료되지 않으면 상위 프로세스는 다른 작업을 할 수 없다.