Sync-Async , Blocking-non blocking 이 두개는 모두 동기/비동기 이다.
이 두가지 단어를 조금 혼용해서 사용하여 혼란을 유래할 수 있다.그렇기때문에 이에 대한 내용들을 조금 자세히 정리하여보자.
우선, 우리가 알고있는 기본적인 동기와 비동기 이다.
Sync - 동기
Async - 비동기
작업이 끝난 뒤 작업을 하는것을 “동기방식” 이라고 한다.
이처럼 작업이 끝나기 전, 다른 작업을 같이 병행하여 진행하는것을 비동기 라고 한다. 병렬처리라고 볼 수 있다.
Blocking - Non Blocking도 동기와 비동기 이다.
여기서 Blocking과 Non Blocking은 제어권의 관점이다.
Blocking의 경우 제어권이 새로 호출된 함수에게 넘어가고,
Non Blocking의 경우 제어권이 기존 함수에게 있다는 것이다.
사실, Sync - Async에 비해 Blocking - Non Blocking의 개념은 생소한 개념이라 이해가 잘 되지 않는다. 이 내용들을 다시 한번 정리를 해 보자면,
Blocking의 경우, 현재 진행중인 작업 중에 다른 작업이 들어오면 다른 작업의 return이 생기기 전 까지 대기를 하게 된다.
이에 반해 Non Blocking은 기존 작업을 진행하던 중 다른 작업이 들어왔을 때 다른 작업의 return이 생기기 전까지 대기하는것이 아닌, 다른 작업에서 우선 기존 작업을 진행시킨 다. 이 후 다른 작업이 끝이나면 해당 작업의 결과를 return시킨다.
여기까지 봐도 이해가 잘 되지 않을 수 있다. 사실 필자는 Non Blocking이 어떤 느낌인지는 알겠지만 정확히 글로 설명하기가 어려웠다.
우아한Tech의 멍토님께서 발표하신 Blocking vs Non Blocking, Sync vs Async의 영상을 참고한 예시인데 Non Blocking의 예시가 와닿았다.
직장 상사에게 서류를 전달한다는 가정을 하자.
이 서류의 피드백을 받기 전 까지 상사의 옆에서 대기한다 → Blocking
이 서류의 피드백은 시간이 좀 걸릴테니 일단 네 하던 일을 해라 → Non Blocking
Blocking 과 Non Blocking은 제어권의 주체에 따라서 나뉘어지는것이며,
Sync 와 Async는 순서와 결과에만 관심을 가지는것을 뜻한다.
Bloking - Non Blocking 과 Sync - Async는 조합을 하여 사용할 수 있다.
위 처럼 총 4개의 조합이 만들어진다.
이 조합들의 예시는 해당 블로그에서 참고를 하였다.
바로 시험기간의 선생님과 학생을 예시로 들었는데 이 예시도 너무 좋았다.
상위 프로세스인 “선생님” 과 하위 프로세스인 “학생"의 관점이다.
이 조합은 완전 FM선생님이다.
이게 무슨소리인가 싶을텐데, 시험 당일 FM선생님은 학생들이 문제를 풀 때 계속해서 교실을 돌아다니며 감시를 하는것이다.
즉, 위 설명을 풀어보자면
많이사용하는 조합 중 하나이며, 모든 실행과 흐름이 순차적이라 개발자가 프로그램을 제어하기 쉽다는 장점이 존재한다.
하지만, 상위 프로세스(선생님)은 하위 프로세스(학생)의 작업완료 여부를 신경쓰기 때문에 학생들의 문제풀이가 완벽히 끝나고 시험시간이 끝나기 전 까지 상위 프로세스(선생님)은 다른 작업을 할 수 없다는 단점이 있다.
이는 과외 선생님으로 비유를 하면 좋다.
과외 선생님이 학생의 레벨테스트를 위해 시험을 친다.
이 때 과외 선생님은 학생의 뒤에서 이어폰을 끼고 유투브를 시청하는데, 이 때 학생에게 중간중간 계속해서 “시험 다 봤니?”라고 물어보다가 끝나면 바로 채점을 진행하는 방식이다.
장점이 그닥 없는 방식이라 자주 채택하는 방식은 아니다. 하지만, Non Blocking + Async 방식을 사용하는 과정에서 하나라도 Blocking방식을 사용해야 할 때 의도치않게 이 방식이 사용이 된다.
이는 AM선생님이다.
학생들에게 시험지를 배부하고 자기 할 일만 한다. 교실을 돌아다니며 감독하는 행동은 하지 않고, 교탁 앞에서 자기가 처리해야하는 업무만 하다가 시험이 끝나면 시험지를 걷고 나가버리는 것이다.
이는 상위 프로세스(선생님)은 하위 프로세스(학생)의 작업완료 여부가 궁금하지 않다.
그러다보니 상위 프로세스(선생님)은 자기가 처리해야할 일을 한번에 여러개를 할 수 있는것이고, 하위 프로세스(학생)은 그저 자기가 해야할 일을 묵묵히 하고 결과를 상위 프로세스(선생님)에게 전달만 하는것이다.
이는 일반적인 Non Blocking과 다르지 않다.
이것도 과외선생님으로 예시를 들어보겠다.
과외선생님은 시작하자마자 학생에게 시험지를 주고 “풀어서 카톡으로 보내" 라고 한 뒤 본인의 일이 더 중요하다는 생각에 바로 집으로 가버리는 것이다.
가장 많이 사용되는 조합 중 하나로, 성능과 자원 효율면에서 가장 우수한 방법이다.
동시에 여러 작업들이 진행될 수 있기 때문이다.
왜 효율적인것일까?
이는 상위 프로세스(선생님)에게 초점이 맞추어진 상태이다. 하위 프로세스(학생)은 작업을 다 처리하고 바로 상위 프로세스(선생님)에게 결과를 던져준다. 하지만, 상위 프로세스(선생님)는 하위 프로세스(학생)의 작업 결과를 확인하기 전, 상위 프로세스(선생님)의 작업을 완료하고 확인을 하게 된다.