JAVA NIO 란

NIO (New Input/Output)

  • Non-blocking I/O (일반적으로 NIO라고 불리우며, New I/O라고도 한다) 기존 I/O에서 확장되어 제공하는 자바 프로그래밍 API.
  • I/O 클래스는 소스로부터 데이터를 읽고 쓰는 목적이다.

JAVA I/O 수행 과정

image

  1. Disk에서 데이터 read
  2. 커널 영억 메모리 버퍼에 데이터 write
  3. 커널에서 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의 흐름

image

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로 구현하는것이 더 좋다.