Blocking I/O vs Non-Blocking I/O
blocking I/O 와 non-blocking I/O의 차이는 특정 시스템(OS, 웹 서비스, DB 인스턴스 등)에 요청 후 응답을 기다리는 시점에 스레드가 block되어 응답을 받을 때까지 기다리냐(Syncronous), block되지 않고 다른 일을 처리하냐(Asyncronous)의 차이이다. 즉, Blocking I/O는 입출력 작업을 동기적으로 처리하는 것, Non-Blocking I/O는 입출력 작업을 비동기적으로 처리하는 것이다.
Non-Blocking I/O 에서 응답을 확인하는 방법
여기서 의문이 생길 것이다. Blocking I/O는 요청 및 응답을 동기로 처리하기에 스레드는 요청한 뒤 응답을 기다리다가 받아서 나머지 작업을 처리하면 되는 간단한 프로세스로 돌아간다.
하지만 Non-Blocking I/O는 응답을 어떻게 받아야 할까? Non-Blocking I/O에서 스레드는 특정 시스템에 요청한 뒤 응답을 대기하지 않고 다른 작업을 처리하기에 일정 시간마다 응답이 왔는지 확인하는 방법을 사용해야 한다. Non-Blocking I/O 방식에서 스레드가 응답을 확인하는 방법은 크게 3가지로 분류된다.
요청이 완료되었는지 반복적으로 확인
스레드가 비동기적으로 요청한 뒤 다른 작업을 수행하다가 특정 주기로 요청에 대한 응답이 완료되었는지, 데이터를 반환가능한지 확인하는 방식으로 응답을 확인할 수 있다. 이러한 방식은 요청에 대한 응답 준비가 완료된 시간과 이를 확인하는 시간의 갭으로 인해 처리 속도 측면의 오버헤드가 발생할 수 있다는 단점이 존재한다.
또한 응답 준비가 완료되었는지 반복적으로 확인하는 작업이 필요하다. 이는 응답 준비가 완료되었는지 확인하는 스레드의 작업이 주기적으로 실행 되어야 하기에 CPU 사용 측면의 오버헤드가 발생할 수 있다.
I/O Multiplexing(멀티플렉싱; 다중 입출력)
관심사가 비슷한 I/O 작업들을 하나의 스레드가 동시에 모니터링 하고, 처리할 수 있도록 하는 기술이다. I/O multiplexing의 종류에는 select, poll, epoll, kqueue, IOCP가 있다. select 와 poll은 성능 측면에서 효율적이지 않아 잘 사용하지 않는다. epoll은 Linux에서 kqueue는 MacOS에서 IOCP는 Windows에서 사용된다.
Callback/signal 사용
시스템에서 요청에 대한 응답의 준비가 완료되면 콜백이나 시그널을 사용하여 응답을 전달하는 방식이다.
장단점
Blocking I/O의 장점은 간단하고 직관적인 코드를 작성할 수 있고, I/O 작업이 완료되었는지 확인하는 작업을 수행할 필요가 없다는 것이다. 하지만 스레드는 I/O 작업이 완료될 때까지 block 되므로 다른 작업을 수행하지 못하고 CPU를 점유하기에 컴퓨팅 자원을 효율적으로 사용하지 못한다는 단점이 존재한다.
Non-Blocking I/O의 장점은 Blocking I/O의 정반대라고 생각하면 된다. 스레드가 block 상태가 되지 않으므로 컴퓨팅 자원을 효율적으로 사용할 수 있는 반면 I/O 처리 코드가 복잡하고 멀티플렉싱, 콜백/시그널 등의 작업을 통해 응답을 주기적으로 확인하는 데 있어 오버헤드가 발생할 수 있다는 단점이 존재한다.
Blocking I/O는 I/O작업이 빠르고 간단한 경우에 사용하면 좋고, Non-Blocking I/O는 I/O 작업이 느리고 복잡한 경우 효율적으로 사용할 수 있을 것으로 예상된다.
'CS' 카테고리의 다른 글
DDD - 외부 시스템 호출 분리와 이벤트 (0) | 2024.04.06 |
---|---|
DDD - 애그리거트 트랜잭션 관리와 동시성 처리 (0) | 2024.04.05 |
DDD - 도메인과 애그리거트 (1) | 2024.03.27 |
IPC: 메시지 포맷과 설계 순서 (3) | 2024.03.19 |
비동기 메시징 통신: Message vs Event (0) | 2024.03.17 |