New IO

|

JAVA NIO (New IO)

Overview

1. 채널과 버퍼

​ IO API는 byte stream과 character stream을 사용하지만 NIO API는 channelbuffer 를 사용한다.

​ 데이터는 항상 채널에서 버퍼로 읽혀지고, 버퍼에서 채널로 쓰여진다.

buffer-oriented

​ 1. 버퍼를 이용함으로서 데이터를 캐싱할 수 있다

​ 2. read/write 과정을 추적하고 부가적인 작업(전처리/후처리)를 하기에 용이하다.

​ 3. 버퍼에 read/write 작업 전에 버퍼가 비었는지 확인하는 작업이 필요하다

2. Non-blocking IO

​ 자바 NIO에서는 non-blocking IO가 가능하다. 예를들어 하나의 스레드는 채널에게 버퍼에 데이터를 읽어오도록 시킬 수 있 고 채널이 데이터를 버퍼로부터 읽는 동안 스레드는 다른 작업을 수행할 수 있다. 데이터가 채널에서 버퍼로 읽혀지면, 스레드를 해당 버퍼를 이용한 process를 계속할 수 있다. write 경우도 마찬가지다.

3. Selectors

Selector는 기본적으로 epoll 기반으로 동작하며, 커널 버전이 2.6 이하라면 poll 방식으로 동작한다

​ 자바 NIO에는 Selector 라는 개념이 존재한다. Selector는 여러 채널에 이벤트( connection opened, data arrived )가 발생하는 것을 감시하는 모니터 객체다. 그래서 하나의 스레드에서 여러 채널에 대해 모니터링이 가능하다 ( 멀티플렉싱 )

핵심 컴포넌트

1. 채널

​ 모든 NIO에서 IO는 채널로 시작한다. 채널은 Stream과 유사하다.

​ 하지만 버퍼를 통해서 데이터를 읽고 쓸 수 있다는 차이점이 있다.

Java NIO: Channels and Buffers

​ 몇 가지 핵심적인 Channel을 살펴보자면 아래와 같다.

  • FileChannel - 파일에 데이터를 읽고 쓴다

  • DatagramChannel

    • UDP를 이용해 데이터를 읽고 쓴다
  • SocketChannel

    • TCP를 이용해 데이터를 읽고 쓴다
  • ServerSocketChannel

    • 들어오는 TCP 연결을 수신할 수 있다. 들어오는 연결마다 SocketChannel이 만들어진다

3. Selector

​ 셀렉터를 이용하면 하나의 스레드로 여러 채널을 관리할 수 있다

Java NIO: Selectors

셀렉터를 이용하기 위해서는 채널을 셀렉터에 등록해야 한다. 등록 한 뒤 select() 메서드를 호출하면 이 메서드는 등록된 채널 중에 이벤트가 준비된 것이 있을 때 까지 blocked 될 것이다. 메서드가 리턴된 뒤에 스레드는 이러한 이벤트를 처리할 수 있다.

ref. doc

ref.jenkov blog

ref. javatpoint