IO
- NIO가 나오면서 자바의 기존 IO 방식은 OIO(Old I/O)라고도 불림.
- *InputStream, *OutputStream, *Reader, *Writer...
- 전통적인 blocking call 방식.
- 때문에 FD(소켓, 파일...) 당 하나의 쓰레드가 필요함.
- 때문에, 동시 요청이 자주 발생하는 어플리케이션의 경우 필연적으로 쓰레드 풀을 사용하게 됨.
NIO
- New I/O 로, 자바 1.4에서 등장.
- 주요 요소: Buffer, Charset, Channel, Selector.
- Buffer: NIO의 데이터 저장 컨테이너로, 다이렉트 버퍼, 논 다이렉트 버퍼(힙 버퍼)로 나뉨. 다이렉트 버퍼는 네이티브 메모리를 사용하고, 논 다이렉트 버퍼는 JVM의 힙 메모리를 사용함.
- Channel: 데이터가 오고 가는 양방향 통로.
- Selector: non-blocking, 이벤트 방식으로, 지정한 채널에 발생한 이벤트를 수신하여 이벤트 유형에 맞는 동작을 처리할 수 있음.
- 결정적으로, OIO에서는 다수의 요청을 받아들이기 위해 많은 수의 쓰레드를 필요로 했지만, NIO에서는 Selector를 조회하는 하나의 쓰레드만으로 다수의 요청을 커버할 수 있음. 물론 요청의 성격에 따라 별도의 처리 쓰레드가 필요할 수 는 있다.
- 자바 6 부터는 epoll을 지원하여, 런타임 os가 리눅스 커널 2.6 이상이라면 epoll을 디폴트로 한다. poll을 사용하려면 아래와 같이 시스템 프로퍼티로 제어 가능함.
System.setProperty("java.nio.channels.spi.SelectorProvider", "sun.nio.ch.PollSelectorProvider");
- 이렇게, NIO는 os specific하다. os의 기능을 차용하여, 아래와 같이 런타임 os에 따라 동작을 달리한다.
Windows: select
Mac OS: Kqueue
리눅스 커널 2.6+: epoll
솔라리스: poll
NIO2
- 그냥 NIO로 통틀어 말하기도 함. 자바 1.7에서 등장. 네트워킹 I/O에는 마이너한, 파일 I/O에는 메이저한 변화가 있었음.
- Async* 시리즈의 등장으로, 비동기 콜백 방식의 I/O를 지원함.
'Java > Core' 카테고리의 다른 글
Java 13 간략히 정리 (0) | 2020.07.16 |
---|---|
Java 12 간략히 정리 (0) | 2020.07.15 |
Java 11 간략히 정리 (0) | 2020.07.15 |
Java 10 간략히 정리 (0) | 2020.07.15 |
람다 (0) | 2020.01.05 |