Blocking I/O
Blocking I/O는 입출력 작업이 완료될 때까지 프로그램의 실행을 중단시키는 방식입니다.
- 프로세스가 I/O 작업을 요청하면, 해당 작업이 완료될 때까지 대기
- 대기 중에는 다른 작업을 수행할 수 없음
- 주로 JDBC를 통한 데이터베이스 쿼리나 동기적 메소드 호출 등에서 사용
Non-Blocking I/O
Non-Blocking I/O는 입출력 작업의 완료 여부와 관계없이 프로그램이 계속 실행되는 방식입니다.
- I/O 작업을 요청한 후 즉시 제어권을 반환받아 다른 작업을 수행 가능
- I/O 작업의 완료 여부는 주기적으로 확인하거나 콜백 등을 통해 알림을 수신
- 다중 연결을 효율적으로 처리할 수 있어 확장성이 높음
Blocking, Non-Blocking I/O 차이점
- 제어권: Blocking I/O는 I/O 작업 동안 제어권을 커널에 넘기지만, Non-Blocking I/O는 애플리케이션이 제어권을 유지
- 리소스 활용: Blocking I/O는 I/O 대기 중 CPU 자원을 낭비할 수 있지만, Non-Blocking I/O는 더 효율적으로 리소스를 활용 가능
- 구현 복잡성: Blocking I/O는 구현이 간단하지만, Non-Blocking I/O는 상대적으로 복잡한 구현이 필요
- 확장성: Non-Blocking I/O는 다중 연결 처리에 더 적합하여 높은 확장성을 제공
Synchronous(동기)
- 작업 요청 후 그 결과를 직접 받아 처리
- 요청한 작업이 완료될 때까지 계속 관심을 가지고 대기
- 작업 순서가 보장되며, 로직이 단순하고 직관적
Asynchronous(비동기)
- 작업 요청 후 결과를 기다리지 않고 다른 작업을 수행
- 작업 완료 시 콜백, 이벤트 등을 통해 결과를 전달받아 처리
- 자원을 효율적으로 사용할 수 있지만, 로직이 복잡도 상승
Blocking/Non-Blocking과 동기/비동기의 차이점
Blocking과 Non-Blocking은 작업 수행 시 제어권에 관련되어 있습니다. 그렇다면 동기/비동기와 Blocking/Non-Blocking의 차이점에 대하여 알아보면 다음과 같습니다.
- 관심사의 차이:
- Blocking/Non-Blocking은 I/O 작업 수행 시 제어권에 관한 것
- 동기/비동기는 작업 완료 후 결과 처리 방식에 관한 것
- 작업 처리 방식:
- Blocking은 작업 완료까지 대기하고, Non-Blocking은 즉시 반환
- 동기는 작업 완료를 직접 확인하고, 비동기는 완료 시 통지를 받음
- 자원 활용:
- Non-Blocking과 비동기 방식이 일반적으로 자원을 더 효율적으로 활용 가능
- 구현 복잡성:
- Blocking과 동기 방식이 구현이 더 단순하고 직관적인 경향
출처