Yebali

Sync/Async, Blocking/Non-Blocking 본문

Backend Common

Sync/Async, Blocking/Non-Blocking

예발이 2023. 10. 9. 16:32

Sync/Async, Blocking/Non-Blocking는 면접에 자주 나오면서도 헷갈리기 쉬운 개념 같다.

 

Sync / Async

Sync/Async의 차이는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰느냐 이다.

Sync

Sync는 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓴다.

호출하는 함수는 호출된 함수의 작업 완료 후 반환되는 값을 기다리거나, 바로 반환되더라도 호출된 함수의 작업 완료여부를 계속 신경 쓴다.

카페에서 아이스 아메리카노를 시키고 픽업하는 곳에서 커피를 기다리고 있거나,
자리에서 진동벨을 보며 커피가 나왔는지 계속 확인하고 있다면 그것은 Sync이다.

Async

Async는 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰지 않는다.

호출된 함수는 작업 완료 후 전달받은 Callback을 실행한다.

카페에서 커피를 다 마시고 컵을 리턴하는 곳에 두고 나갔다.
하지만 나는 그 컵을 직원이 정리하는지, 혹은 다 정리했는지 전혀 신경 쓰지 않는다. 이것은 Async이다.

 

Blocking / Non-Blocking

Blocking/Non-Blocking의 차이는 호출되는 함수가 제어권을 호출한 함수에게 반환하느냐 이다.

여기서 제어권은 함수가 코드를 실행할 수 있는 권한 같은 것을 말한다.

Blocking

Blocking은 호출되는 함수가 호출하는 함수에게 제어권을 바로 반환하지 않는다.

호출하는 함수는 호출된 함수가 작업을 마치고 제어권을 반환할 때까지 아무 일도 하지 않는다.

카페에서 아이스 아메리카노를 시켰다. 카페 주인은 금방 나올 것이니 꼼짝 말고 기다리라고 하였다.
나는 아무것도 하지 못하고 주인 앞에서 커피를 기다렸다. 이것은 Blocking이다.

Non-Blocking

Non-Blocking은 호출되는 함수가 호출하는 함수에게 제어권을 바로 반환한다.

호출하는 함수는 반환받은 제어권으로 호출된 함수가 작업하는 동안 자신도 다른 작업을 할 수 있다.

카페에서 아이스 아메리카노를 시켰다.
나는 커피가 준비되는 동안 자리를 찾고 공부할 것들을 준비했다. 이것은 Non-Blocking이다.

Sync/Async, Blocking/Non-Blocking개념은 서로 조합되어 사용되며 개발자라면 어렴풋이 다들 알고 있다.

Sync+Blocking / Async+Non-Blocking

먼저 가장 흔하게 사용되는 두 가지 조합이다.

Sync + Blocking

Sync+Blocking은 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰고,

호출되는 함수는 자신의 작업이 완료될 때까지 제어권을 반환하지 않는다.

호출하는 함수는 호출되는 함수의 작업이 끝날 때까지 대기하다가 호출되는 함수의 작업이 완료되면 결과와 제어권을 함께 반환받아 자신의 작업을 이어 진행한다.

 

Async + NonBlocking

Async+Non-Blocking은 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰지 않고,

호출되는 함수는 제어권을 바로 반환한다.

호출하는 함수는 함수를 호출 후 호출되는 함수의 작업 완료 여부를 신경쓰지 않고 바로 제어권을 돌려받아 다른 작업을 수행한다.

호출되는 함수는 자신의 작업이 완료되면 콜백을 호출한다.

 

Sync+Non-Blocking / Async+Blocking

보기 힘든 조합이다.

Sync+Non-Blocking

Sync+Non-Blocking은 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰고, 호출되는 함수는 제어권을 바로 반환한다.

호출하는 함수는 제어권을 돌려받았기 때문에 다른 작업을 진행할 수 있지만 호출했던 함수의 작업이 완료되었는지 지속적으로 확인한다.

Async+Blocking

Async+Blocking은 호출하는 함수가 호출되는 함수의 작업 완료 여부를 신경 쓰지 않지만

호출되는 함수가 자신의 작업이 완료될 때까지 제어권을 반환하지 않기 때문에 호출되는 함수의 작업이 끝날 때까지 대기해야 한다.

 

정리

우리가 흔히 말하는 동기/비동기는 Sync+Blocking와 Async+Non-Blocking 조합을 말한다.

하지만 흔치 않은 Sync+Non-Blocking, Async+Blocking 조합도 보일 수 있으니 알아는 두자.

 

 

참조

'Backend Common' 카테고리의 다른 글

Kubernetes의 Control Plane와 Node, Namespace  (0) 2024.03.03
k8s 환경에서 pinpoint 적용하기 (feat. NCP)  (1) 2023.12.31
백엔드 면접 질문  (0) 2023.08.09
docker-compose  (0) 2023.07.09
분산락과 Redisson  (0) 2023.05.08