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 | 호출자는 다른 작업 수행 가능하며, 결과를 얻은 후 직접 처리 | 호출자는 다른 작업 수행 가능하며, 결과는 호출된 대상이 처리 |