자바

자바 IO 와 NIO 의 차이점과 선택

알통몬_ 2017. 4. 14. 19:41
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


NIO :

자바 버전 4 부터 새로운 입출력 이라는 뜻에서 java.nio 패키지에 포함이 되었다가

자바 버전 7로 버전 업을 하면서 자바 IO 와 NIO 사이의 일관성이 없는 클래스 설계를 바로 잡고

비동기 채널 등의 네트워크를 지원을 대폭 강화시킨 NIO.2 API 가 추가되었습니다.

NIO.2 는 java.nio의 하위 패키지( java.nio.channels, java.nio.charset, java.nio.file )에 통합되어 있습니다.



스트림과 채널


 IO 는 스트림 기반입니다.

스트림은 입력 스트림과 출력 스트림이 구분되어  있습니다.

IO도 스트림 기반이기 때문에 데이터를 읽기 위해 입력 스트림과 데이터 출력을 위해

출력 스트림을 생성해야 합니다.


NIO는 채널 기반입니다.

채널은 양방향으로 입출력이 가능합니다.

때문에 NIO는 입력과 출력을 위한 별도의 채널을 만들 필요가 없습니다.



넌버퍼와 버퍼


 IO 에서 출력 스트림이 1Byte를 쓰면 입력 스트림이 1Byte를 읽습니다.

이러한 시스템은 대체로 느립니다. 때문에 버퍼를 사용해 복수 개의 바이트를 한꺼번에 입력 받고

출력하는 것이 좋습니다.

IO는 버퍼를 제공해주는 보조 스트림인 BufferedInputStream, BufferedOutputStream을

연결해서 사용하기도 합니다.


NIO 는 기본적으로 버퍼를 사용해 입출력을 하기 때문에 IO보다 성능이 좋습니다.

채널은 버퍼에 저장된 데이터를 출력하고 입력된 데이터를 버퍼에 저장합니다.

IO는 스트림에서 읽은 데이터를 바로 처리하기 때문에 스트림으로부터 입력된 전체 데이터를

별도로 저장하지 않으면 입력된 데이터의 위치를 이동해가며 자유롭게 이용할 수 없습니다.

NIO는 읽은 데이터를 무조건 버퍼에 저장하고 데이터의 위치를 이동해가며

필요한 부분만 읽거나 쓸 수 있습니다.



블로킹과 넌블로킹


 IO는 블로킹이 됩니다. 입력 스트림의 read()를 호출하면 데이터가 입력되기 전까지

스레드는 블로킹되고 출력 스트림의 write()를 호출하면 데이터 출력 전까지 스레드는 블로킹됩니다.

IO 스레드가 블로킹되면 다른 일을 할 수가 없고, 블로킹을 빠져나오기 위해 인터럽트할 수도 없습니다.

유일한 방법은 스트림을 닫는 것입니다.

NIO는 블로킹과 넌블로킹의 특징을 모두 가집니다.

NIO 블로킹은 스레드를 인터럽트 함으로써 빠져나올 수 있습니다.

넌블로킹 : 입출력 작업 시에 스레드가 블로킹되지 않는 것을 말합니다.

NIO의 넌블로킹은 입출력 작업 준비가 완료된 채널만 선택해서

작업 스레드가 처리하므로 작업 스레드가 블로킹되지 않습니다.

NIO 넌ㅂㄹ로킹의 핵심 객체는 멀티 플렉서인 Selector 셀렉터입니다.

셀렉터는 복수 개의 채널 중에서 준비완료된 채널을 선택하는 방법을 제공합니다.



IO 와 NIO 중 어떤 선택을?

 

 NIO는 불특정 다수의 클라이언트와 연결 또는 멀티 파일들을 넌블로킹이나 비동기 처리를 할 수 있습니다 -> 과도한 스레드 생성을 피하고 스레드를 효과적으로 재사용한다는 장점이 있습니다.

운영 체제의 버퍼를 이용한 입출력이 가능하기 때문에 입출력 성능이 향상됩니다.

NIO는 연결 클라이언트 수가 많고, 하나의 입출력 처리 작업이 오래걸리지 않는 작업에

사용하는 것이 좋습닏. 스레드에서 입출력 처리가 오래 걸린다면 대기하는 작업의 수가 늘어나기

때문에 제한된 스레드로 처리하는 것이 불편할 수도 있습니다.

대용량 데이터를 처리하는 경우라면 IO가 좋습니다. NIO는 버퍼 할당 크기가 문제가 되고

모든 입출력 작업에 버펴를 무조건 사용해야 하기 때문에 즉시 처리하는 IO보다 조금 복잡합니다.

연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있다면

IO로 서버를 구현하는 것이 좋습니다.



이상입니다.

반응형