Blocking과 Non-Blocking은 프로세스나 스레드가 작업을 처리하는 방식에서 중요한 개념으로, 동기적 처리와 비동기적 처리와도 밀접하게 연관되어 있다.
1. Blocking
Blocking은 작업이 완료될 때까지 해당 프로세스나 스레드가 기다리는 방식입니다. 즉, 작업이 끝날 때까지 다음 작업으로 진행하지 못하고 멈춘 상태로 대기합니다.
특징
- 동기적 처리: 대부분의 Blocking 작업은 동기적으로 이루어집니다.
- 대기 상태: 작업이 완료될 때까지 다른 작업을 수행하지 못함.
- 단순한 구현: 구현이 간단하며 디버깅이 용이.
장점
- 예측 가능한 동작 방식.
- 구현 및 유지보수가 쉬움.
단점
- 대기 시간 동안 자원이 낭비됨.
- 시스템의 응답 속도가 저하될 가능성.
예시
- 파일 읽기/쓰기: read() 또는 write() 호출이 완료될 때까지 대기.
- 데이터베이스 작업: 트랜잭션 완료 후 응답을 기다림.
InputStream input = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer); // 데이터가 들어올 때까지 Blocking.
2. Non-Blocking
Non-Blocking은 작업이 즉시 처리되지 않더라도 다음 작업을 수행할 수 있는 방식입니다. 즉, 작업이 완료되지 않아도 기다리지 않고 다른 작업을 계속 진행합니다.
특징
- 비동기적 처리: Non-Blocking은 주로 비동기적으로 실행됩니다.
- 효율적인 자원 활용: 한 작업이 완료되기를 기다리지 않고 다른 작업을 수행 가능.
- 복잡한 구현: 상태 관리가 필요하여 구현 난이도가 높음.
장점
- 자원의 효율적 사용.
- 높은 응답 속도.
- 대규모 동시 처리에 유리.
단점
- 코드 복잡성 증가.
- 디버깅 및 유지보수 어려움.
예시
- 이벤트 기반 프로그래밍: 이벤트 루프에서 작업이 완료되면 콜백 호출.
- 비동기 데이터베이스 작업: 작업이 완료되면 콜백 또는 Future 객체로 결과 전달.
socketChannel.configureBlocking(false);
int bytesRead = socketChannel.read(buffer); // 데이터가 없어도 바로 반환.
if (bytesRead > 0) {
// 데이터 처리.
} else {
// 데이터가 아직 준비되지 않음.
}
3. Blocking vs Non-Blocking 비교
특징 | Blocking | Non-Blocking |
처리 방식 | 동기적 처리 | 비동기적 처리 |
대기 시간 | 작업 완료 시까지 대기 | 대기하지 않고 즉시 반환 |
자원 효율성 | 낮음 | 높음 |
복잡성 | 낮음 | 높음 |
적합한 환경 | 단일 작업 처리, 간단한 시스템 | 대규모 동시 처리, 고성능 시스템 |
4. 활용 예시
Blocking이 적합한 경우
- 작업이 단순하고, 대기 시간 동안 다른 작업을 수행하지 않아도 되는 경우.
- 예: 단순한 파일 읽기/쓰기, 동기적 데이터베이스 호출.
Non-Blocking이 적합한 경우
- 대규모의 동시 작업을 효율적으로 처리해야 하는 경우.
- 예: 네트워크 서버, 비동기 HTTP 요청, 이벤트 기반 애플리케이션.
결론
Blocking은 단순하지만 대기 시간 동안 자원이 낭비될 수 있는 반면, Non-Blocking은 효율적이지만 구현이 복잡합니다.
'IT 개발 라이프 > CS' 카테고리의 다른 글
TCP와 UDP: 무엇이 다를까? (0) | 2024.12.27 |
---|---|
Redis란? (고성능 인메모리 데이터 스토어) (0) | 2024.12.27 |
클라우드 컴퓨팅과 AWS (3) | 2024.12.23 |
도커(Docker)와 컨테이너(Container) (0) | 2024.12.23 |
하이퍼바이저(Hypervisor)란 무엇인가? (1) | 2024.12.23 |