• Home
  • About
    • lahuman photo

      lahuman

      열심히 사는 아저씨

    • Learn More
    • Facebook
    • LinkedIn
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Blocking / Non-Blocking 과 동기 / 비동기의 차이

11 Jul 2023

Reading time ~2 minutes

Blocking / Non-Blocking 과 동기 / 비동기의 차이

단어 정의

  • caller : 호출 하는 함수
  • callee : 호출 당하는 함수

개념 정리

Blocking과 Non-blocking은 프로그래밍에서 동기성과 관련된 개념으로, 작업의 완료 여부를 기다리는 방식을 나타냅니다.

  • Blocking:
    • Blocking은 호출된 작업이 완료될 때까지 호출자(또는 스레드)가 대기하는 방식입니다. 즉, 작업이 완료되기 전까지는 다른 작업을 수행할 수 없습니다. 호출자는 작업이 완료될 때까지 멈추고, 작업이 끝나면 결과를 반환받아 다음 동작을 수행합니다. 이러한 방식은 동기적인 특성을 가지며, 단일 스레드에서는 다른 작업을 수행하지 못하고 대기해야 합니다. Blocking 작업은 I/O 작업, 데이터베이스 쿼리 등에서 주로 발생할 수 있습니다.
  • Non-blocking:
    • Non-blocking은 호출된 작업이 완료되지 않더라도 호출자(또는 스레드)가 블록되지 않고 다른 작업을 수행할 수 있는 방식입니다. 작업은 비동기적으로 수행되며, 호출자는 작업을 요청하고 다른 작업을 수행한 뒤 나중에 작업의 완료 여부를 확인합니다. 이러한 방식은 작업이 완료되기를 기다리는 동안 다른 작업을 처리할 수 있으므로 자원을 효율적으로 활용할 수 있습니다. Non-blocking 작업은 네트워크 통신, 이벤트 처리 등에서 주로 사용될 수 있습니다.

Blocking과 Non-blocking은 작업의 동기성과 호출자의 대기 여부에 관련된 개념이므로, 특정 작업의 특성과 요구사항에 맞춰 적절한 방식을 선택하는 것이 중요합니다.

동기(Synchronous)와 비동기(Asynchronous)는 작업의 실행 방식과 완료 여부를 기준으로 나뉘는 개념입니다.

  • 동기 (Synchronous):
    • 동기적 작업은 작업의 호출과 완료가 순차적으로 진행되는 방식입니다. 작업을 호출한 후에는 작업이 완료될 때까지 호출자(또는 스레드)가 대기합니다. 호출자는 작업의 결과를 반환받고, 그 이후에 다음 동작을 수행합니다. 동기적 작업은 호출자가 작업의 완료를 기다리기 때문에 호출자는 작업의 속도에 영향을 받을 수 있습니다.
  • 비동기 (Asynchronous):
    • 비동기적 작업은 작업의 호출과 완료가 동시에 진행되지 않고, 작업을 호출한 후에도 호출자(또는 스레드)가 다른 작업을 수행할 수 있는 방식입니다. 작업은 백그라운드에서 비동기적으로 실행되며, 작업의 완료 여부를 호출자가 대기하지 않고 나중에 확인할 수 있습니다. 비동기적 작업은 일반적으로 콜백 함수, 프라미스(Promise), 비동기/대기(Async/await) 등을 통해 작업의 완료를 처리하고 결과를 처리합니다. 이를 통해 호출자는 다른 작업을 수행하면서 자원을 효율적으로 활용할 수 있습니다.

동기적 작업은 작업의 완료를 기다려야 하므로 호출자가 블록될 수 있지만, 결과의 순서와 신뢰성을 보장할 수 있습니다. 반면 비동기적 작업은 작업의 완료 여부를 기다리지 않아도 되므로 호출자는 다른 작업을 수행할 수 있지만, 작업의 순서와 결과의 처리는 추가적인 관리가 필요할 수 있습니다.

동기/비동기는 작업의 특성과 환경에 따라 선택되며, 비동기적 작업은 주로 네트워크 통신, 이벤트 처리 등에서 사용됩니다.

동기 Blocking

sequenceDiagram; alt Blocking; Caller->>+Callee: call; note right of Callee: getResult; Callee->>-Caller: return value; end;

비동기 Blocking

sequenceDiagram; alt Blocking; Caller->>+Callee: call; note right of Callee: getResult; note right of Callee: callback; Callee->>-Caller: return value; end

동기 Non-blocking

sequenceDiagram; Caller->>+Callee: call; note right of Callee: getResult; Callee->>+Caller: return future; Caller->>-Callee: isDone; Callee->>+Caller: No; Caller->>-Callee: isDone; Callee->>+Caller: No; Caller->>-Callee: isDone; Callee->>-Caller: Yes;

비동기 Non-blocking

sequenceDiagram; Caller->>Callee: call; Callee->>Caller: return void; note right of Callee: getResult; note right of Callee: callback;

정리

  동기 비동기
Blocking 호출자는 작업 완료까지 대기하고, 결과를 직접 처리 호출자는 작업 완료까지 대기하고, 결과는 호출자가 처리
Non-Blocking 호출자는 다른 작업 수행 가능하며, 결과를 얻은 후 직접 처리 호출자는 다른 작업 수행 가능하며, 결과는 호출된 대상이 처리

참고자료

  • Spring WebFlux 완전 정보


개념 Share Tweet +1