Search

블로킹 논블로킹 동기 비동기

태그
면접질문
CS
작성 상태
작성 완료
작성일
2024/11/15
참고 링크
참고 링크 2
얼마전 어떤 기업의 면접에서 이들의 차이를 질문받았다. 제대로 대답하지 못한 것 같아서 다시 정리해보았다.
블로킹과 논블로킹, 동기와 비동기 개념은 공통적으로 한 주체가 다른 주체에게 작업의 실행을 넘긴 상황을 구분하는 개념이다.

블로킹과 논블로킹

블로킹은 다른 주체가 작업을 끝낼 때까지 작업을 넘긴 주체가 다른 작업을 진행할 수 없는 것을 말한다.
반대로 논블로킹은 작업을 넘긴 주체가 다른 작업을 진행할 수 있는 것을 말한다.
즉, 블로킹과 논블로킹은 작업을 넘긴 주체가 넘긴 작업 말고 다른 작업을 계속 할 수 있는지 여부로 구분된다.
블로킹
논블로킹
논블로킹의 경우에도 다른 주체에게 작업을 넘기는 순간에는 다른 작업을 할 수 없다. 하지만 보통 그 시간이 매우 짧아 작업이 끊기지 않은 것과 구분하는 것이 무의미하다.

동기와 비동기

동기는 넘긴 작업의 결과를 기다리는 것을 말하고 비동기는 넘긴 작업의 결과를 기다리지 않는 것을 말한다.
작업을 넘긴 주체가 결과를 기다리는 동안 다른 작업을 하는지 여부는 동기 비동기를 구분하는데 영향을 주지 않는다. 따라서 아래 두 도식은 모두 동기다.
동기 + 블로킹(좌), 동기 + 논블로킹(우)
비동기는 넘긴 작업의 결과를 특별히 기다리지 않는다. 따라서 비동기 작업의 결과를 처리하는 콜백 함수를 미리 지정하는 방식으로 후속 처리를 진행한다. 예를 들어 Java 에서는 CompletableFuture 를 이용해 비동기로 작업을 처리할 수 있다.
CompletableFuture.supplyAsync(() -> "robin") .thenAcceptAsync(System.out::println); for (int i = 0; i < 100; i++) { System.out.println("Continuing with other work..."); }
Java
복사
위와 같은 코드를 작성하면 실행 시마다 조금 다르지만 “Continuing with other work...” 문구들 사이에 robin이 출력되는 것을 볼 수 있다. 즉, “robin”을 출력하는 작업을 다른 스레드로 넘기고, 이를 딱히 기다리지 않고 바로 다음 작업을 진행한 것이다.