New IO
23 Mar 2020 | JavaJAVA NIO (New IO)
Overview
1. 채널과 버퍼
IO API는 byte stream과 character stream을 사용하지만 NIO API는 channel
과 buffer
를 사용한다.
데이터는 항상 채널에서 버퍼로 읽혀지고, 버퍼에서 채널로 쓰여진다.
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과 유사하다.
하지만 버퍼를 통해서 데이터를 읽고 쓸 수 있다는 차이점이 있다.
몇 가지 핵심적인 Channel을 살펴보자면 아래와 같다.
-
FileChannel - 파일에 데이터를 읽고 쓴다
-
DatagramChannel
- UDP를 이용해 데이터를 읽고 쓴다
-
SocketChannel
- TCP를 이용해 데이터를 읽고 쓴다
-
ServerSocketChannel
- 들어오는 TCP 연결을 수신할 수 있다. 들어오는 연결마다 SocketChannel이 만들어진다
3. Selector
셀렉터를 이용하면 하나의 스레드로 여러 채널을 관리할 수 있다
셀렉터를 이용하기 위해서는 채널을 셀렉터에 등록해야 한다. 등록 한 뒤 select() 메서드를 호출하면 이 메서드는 등록된 채널 중에 이벤트가 준비된 것이 있을 때 까지 blocked 될 것이다. 메서드가 리턴된 뒤에 스레드는 이러한 이벤트를 처리할 수 있다.
ref. doc
ref.jenkov blog
ref. javatpoint