Non-blocking I/O (일반적으로 NIO라고 불리우며, New I/O라고도 한다) 기존 I/O에서 확장되어 제공하는 자바 프로그래밍 API.
I/O 클래스는 소스로부터 데이터를 읽고 쓰는 목적이다.
JAVA I/O 수행 과정
Disk에서 데이터 read
커널 영억 메모리 버퍼에 데이터 write
커널에서 JVM영역 메모리 버퍼로 데이터를 copy
NIO
JVM영역에서 buffer를 만들어 사용하지 않고 커널영역에서 직접 만들어 사용하여 기존 I/O보다 성능적으로 이점.
기존 Input/Output Streams
Stream은 흐름, 물줄기같은 것이다. Java I/O에서 Stream은 데이터의 순차적 흐름이다.(바이트, 문자 , 객체일 수 있다.)
Stream의 흐름은 소스(Data Source)로부터 데이터의 사용 목적지(Data sink)까지 흐름을 이야기한다.
Data Source와 연결된 Stream을 Input Stream이라고 하며, Data sink와 연결된 Stream을 Output Stream이라고 한다.
Data Source와 Data sink는 파일, 문자열, 배열, 네트워크 연결 등일 수 있다.
1바이트를 쓰면 그때 다시 1바이트를 읽는 형식으로 느린 성능이다. (넌버퍼)
따라서 복수개의 바이트를 한꺼번에 입력 받고 쓸 수 있는 보조 스트림임 BufferdInputSTream, BufferedOutputStream을 사용.
Stream이 닫힐때 까지 blocking되어 다른 작업을 할 수 없다. (read, wrtie)
Stream의 흐름
NIO Channel
기존 Stream과 달리 input output stream 구분이 없는 양방향 입출력이가능. 따라서 별도로 사용에 따른 생성 필요 없음.
기본적으로 버퍼를 사용하여 입출력을 한다. 기본적으로 성능이 기존 I/O보다 좋음.
채널은 버퍼에 읽은 데이터를 저장하기 때문에 버퍼 내에서 필요한 부분만 읽을 수 있다.
블로킹과 넌블로킹 두개의 특징을 모두 가지고 있다. I/O의 블로킹과의 차이점은 Thread를 Interrupt 함으로써 빠져나올 수 있다. NIO의 넌블로킹은 작업 준비가 완료된 채널만 선택하여 작업 Thread가 처리하기 때문에 블로킹되지 않는다. NIO 넌블로킹의 Selector가 채널 중 준비된 채널을 선택하는 방법을 제공.
I/O와 NIO의 blocking 차이
종류
블로킹 나가는 방법
I/O
Close Stream
NIO
Interrupt & Close Strea
IO 와 NIO 선택
NIO는 다수의 연결이나 파일들을 넌블로킹이나 비동기 처리할 수 있어서 많은 Thread생성을 피하고 Thread를 효과적으로 재사용 한다는 장점이 있다.
NIO는 연결 수가 많고 하나의 입출력 처리 작업이 오래 걸리지 않는 경우에 사용하는 것이 좋다.
입출력 처리가 오래 걸리면 대기하는 작업의 수가 늘어나게 되므로 장점이 사라진다.
큰 데이터의경우 IO가 좋다. NIO는 버퍼 할당 크기가 문제가되고, 모든 입출력 작업에 버퍼를 사용해야하므로 즉시 처리하는 IO보다 성능 저하가 있을 수 있다.
연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요가 있을 경우 IO로 구현하는것이 더 좋다.