글을 계속 읽어봐도 헷갈리기도 해서 좋은 글들을 참조해 다시 정리해보려 한다.
동기: 작업이 시작하고 결과를 기다린다.(결과에 대해 계속 감시를 한다)
비동기: 작업이 시작하고 결과를 기다리지 않는다.(결과를 감시하지 않고 callback을 통해 리턴 받는다)
블록킹: 작업이 시작하고 다른 작업의 실행을 멈춘다(작업 흐름의 제어권을 시작된 작업이 보유하고 통제한다)
논 블록킹: 작업이 시작해도 다른 작업을 계속 실행한다(작업 흐름의 제어권을 그대로 보유하고 계속 실행한다)
이렇게 보면 동기, 비동기는 결과에 중점을 둔다. 블록킹, 논 블록킹은 작업 흐름 및 제어권에 중점을 둔다.
제어권에 대해 좀더 자세히 설명하자면 함수의 코드를 실행할 권리다.
제어권을 가진 함수는 코드를 실행시키고 필요에 따라 다른 함수를 호출하며 제어권을 넘긴다.
제어권을 가진 함수는 자신의 코드를 실행하고 호출한 함수에게 제어권과 함께 결과를 돌려준다.
이 제어권에 동작 방식에 따라서 블록킹, 논 블록킹이 나눠진다.
블록킹이 동작하는 방식은 다음과 같다
제어권에 따라서 코드가 실행되며, B 함수를 호출하며 제어권을 넘겨주면, 기존에 실행되던 A 함수는 실행이 멈춘다.
B 함수의 실행을 마치고 결과와 함께 제어권을 돌려 받으면 다시금 실행을 시작한다.
논 블록킹이 동작하는 방식은 다음과 같다.
A 함수가 B 함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 보유함
A 함수는 제어권을 가지고 있기 때문에 자신의 코드를 계속 실행
정리하자면
동기 & 비동기는 작업을 처리하는 흐름이 관점
즉 호출되는 함수의 결과를 감시하느냐 및 함수 실행의 순차적인 흐름을 따르느냐 여부에 따라 달라짐
블록킹 & 논 블록킹은 작업의 흐름을 막느냐 안막느냐의 관점
즉 제어권의 소유자에 따라서 달라짐