IO의 보충제, NIO
자바는 JVM 위에서 작동해서 메모리에 올라간 데이터를 JVM메모리로 카피해오는 과정이 껴있어 직접 운영체제 레벨의 시스템콜을 사용하는 것 보다 느리다.
자바4에 NIO가 출시되고 자바 7에 클래스 설계 및 비동기 채널 등의 업데이트가 이루어진 NIO 2.0가 NIO의 하위 패키지에 포함된다.
IO와 NIO의 차이점
Stream vs Channel
IO 입력, 출력을 위해 각각의 Stream을 만들고 1바이트씩 처리하는 Stream 기반
NIO 채널 기반으로 하나의 채널로 양방향 입출력이 가능
Non-Buffer vs Buffer
IO 1바이트 쓰기와 읽기의 조합으로 데이터를 주고 받음, 보조 스트림인 BufferedStream을 연결해서 사용하기도 함
NIO 버퍼를 사용해 복수개의 바이트를 쓰고 읽음커널의 시스템 메모리에 접근하는 채널에 의해 JVM 메모리보다 Row Level
Blocking vs Non-Blocking
IO작업 시에 해당 IO thread는 blocking블로킹 되면 다른 작업을 할 수 없고 중단 인터럽트도 불가, 작업 도중에 스트림을 닫아야 블로킹 해제
NIOblocking과 Non-blocking의 특징을 모두 가짐NIO 블로킹은 스레드를 인터럽트함으로 빠져나올 수 있음NIO 논블로킹은 입출력 준비가 완료된 채널만 선택해서 처리하기 때문에 작업 스레드는 블로킹 되지 않음준비 완료된 채널만 골라주는 객체는 멀티 플렉서인 Selector
Selector하나의 thread가 여러개의 input channel을 관리한다.
IO, NIO 알맞은 사용
NIO는 다수의 연결요청을 넌블로킹이나 비동기로 처리할 수 있어서 콜백을 사용해 스레드를 효과적으로 재사용할 수 있다. 따라서 다수의 클라이언트와 통신이 필요하고, 가벼운 입출력 처리 작업 시에 NIO를 사용하기에 적합하다. 무거운 입출력 처리 작업은 스레드에 콜백이 쌓이게 되므로 단점이 될 수 있다.
순차적인 입출력 작업을 원하거나, 대용량 데이터 처리 작업은 바로 처리하는 IO를 사용하기에 적합하다. NIO는 버퍼 할당을 위한 사전 작업의 추가로 인해 IO보다 성능이 저하될 수 있다.
참고
https://altongmon.tistory.com/284