JVM 상에서 동시성과 분산 애플리케이션을 단순화하는 Akka
를 공부하기 앞서, 관련 배경 지식을 공부하던 중 동기(Synchronous)
, 비동기(Asynchronous)
, Blocking
, Non-blocking
이라는 용어들이 계속 사용되어 정리하고 넘어가려고 한다.
동기와 비동기의 차이는 작업을 순차적으로 수행할지 여부이다. 즉, 내부 함수를 호출한 외부 함수가 내부 함수의 return 여부를 신경 쓰는지 여부로 구분할 수 있다.
위와 같이 비동기식을 사용하면 작업 완료 여부를 따지지 않으므로 내부 프로세스 B를 호출한 외부 프로세스 A는 계속 작업을 이어나간다.
비동기는 요청한 작업에 대하여 완료 여부를 신경 쓰지 않고 자신의 그 다음 작업을 수행한다. 즉, I/O 작업과 같은 느린 작업이 발생할 때 기다리지 않고 다른 작업을 처리할 수 있다. 따라서, 비동기를 사용하면 전반적인 성능 향상에 도움을 줄 수 있다.
그리고, 비동기의 또다른 특징은 요청한 작업에 대해 순서가 지켜지지 않을 수 있다는 점이다. 위처럼, 동기는 a-b-c의 작업 순서가 유지되지만, 비동기 처리는 작업이 불규칙한 것을 알 수 있다.
Blocking과 Non-Blocking의 차이점은 다른 작업을 처리하기 위해 현재 작업을 Block
시키는지 여부로 결정한다. 즉, 제어권
의 유무가 Blocking과 Non-blocking의 차이가 된다.
Blocking : 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 return하지 않는 경우 = 내부 함수로 제어권이 넘어간 경우 / 함수 종료 시점과 제어권을 넘김 시점이 같음
Non-Blocking : 호출된 함수가 자신의 할 일을 마치지 않았더라도 바로 제어권을 return하여 호출한 함수가 다른 일을 진행할 수 있도록 하는 경우
사실 그림으로만 보며 공부했을 때는 매우 헷갈렸다. 하지만, 문장으로 정리하면 동기/비동기는 "전체적인 작업에 대한 순차적인 흐름의 유무"라고 생각할 수 있으며, 블로킹/논블로킹은 "전체적인 작업의 흐름 자체를 막냐 안 막냐"로 구분을 할 수 있다.
따라서 동기/비동기와 블록킹/논블록킹을 합해서 정리하면 위와 같다.