티스토리 뷰

블로킹 I/O 방식

블로킹 I/O 방식에서는 I/O 요청에 해당하는 함수 호출은 작업이 완료 될 때까지 스레드의 실행이 차단된다.

즉 I/O가 실행하는 동안 그 스레드의 동작 자체가 멈추고 그 스레드의 CPU는 놀고 있는 것이다.

전통적인 방식에서는 많은 I/O를 처리하기 위해서 멀티스테드를 지원하는 방식으로 진화해나갔다.

 

하지만 여기서의 단점은 스레드의 갯수는 한계가 있다는 것이다.

또한 스레드는 시스템 리소스 측면에서 비용이 그리 싸지 않기 때문에,

각 I/O에 대해서 장시간 사용하지 않고 실행되어 있는 스레드를 방치하는 것은 효율성 측면에서 최상의 방법은 아니다.

 

논블로킹 I/O 방식

이와 반대로 논 블로킹 I/O방식은 리소스를 액세스하는 또 다른 메커니즘을 지원하는데,

이 모드에서 시스템 호출은 데이터가 읽히거나 쓰여질 때까지 기다리지 않고 항상 즉시 반환된다.

호출하는 순간에 결과를 사용할 수 없는 경우,

이 함수는 단순히 미리 정의된 상수를 반환하여 그 순간에 반환할 수 있는 데이터가 없음을 나타낸다.

 

기본적으로 이런 방법을 쓸 때에는 busy waiting을 사용하는데, 이런 경우엔 대부분의 경우 사용할 수 없는 리소스를 반복하는데만 소중한 cpu를 사용한다. 따라서 대부분 엄청난 양의 cpu 시간 낭비를 초래한다.

 

따라서 이런 경우의 해결책은 이벤트 디멀티플렉싱 방법이 있다.

 

이벤트 디멀티플렉싱

이벤트 디멀티플렉싱 방법은 busy waiting을 해결한 논블로킹 I/O 방식인데, 최신 os에서는 대부분 지원한다.

 

이 방법을 동기 이벤트 디멀티플렉서 또는 이벤트 통지 인터페이스라고 부르는데, busy waiting을 하는 대신,

감시자에 지금 하는 작업들을 추가 해놓은 뒤, 처리할 수 있는 이벤트가 하나라도 있으면 그 때 작업을 시작한다. 따라서 busy waiting을 하면서 cpu가 계속 낭비되지 않아도 되는 것이다. 옵저버 패턴에 의한 구현이라고 할 수 있다.

 

 

논 블로킹 I/O의 장점과 단점

 

논 블로킹 I/O방식은 싱글스레드 방식으로, 이벤트 디멀티플렉싱 방법을 사용하기 때문에 cpu의 유휴시간을 최소화 할 수 있다.

 

블로킹 I/O방식과의 차이를 보았을 때, 커피집을 비유로 하자면

한번에 한 주문만 받고 음식을 해온 다음에야 다음 주문을 받는 종업원이 100명 있는 것과

한사람이 주문을 받은 뒤 번호표를 나눠주고, 다른 99명은 요리만 해서 나오면 손님을 호출하는 방식의 차이라고 할 수 있다.

 

하지만 논블로킹 방식의 경우에는 cpu의 할 일(주문을 받는 일)이 많아지면 많아 질 수록 뒤에 주문을 기다리는 사람들이 불편하기 때문에 cpu가 할 일이 많은 작업 같은 경우에는 적합하지 않다. 하지만 file reading, writing과 같은 작업이 많은 경우에는 cpu보다는 I/O 작업이 많기 때문에 좀 더 유리하다고 할 수 있다.

 

 

 

댓글