Home [Java] NIO?
Post
Cancel

[Java] NIO?

3월 4주차 스터디 발표 자료📖
오늘은 IOStream에 이어 NIO에 대해 알아보겠습니다!!
이전 포스팅 [I/O Stream]: https://chonahyeon.github.io/posts/IOStream/

NIO(New Input/Output)


  • Java NIO란 New Input/Output의 약자로 채널이 양방향 버퍼를 통해 외부 데이터와 통신한다.
  • Java NIO는 기존 IO와는 달리 읽기/쓰기를 하나의 통로로 해결한다.
  • 채널?
    • 채널(Channel)은 데이터가 흘러다니는 양방향의 통로이다.
    • 채널은 Buffer를 통해서만 read, write를 할 수 있는 Buffer 방식이며 Blocking과 Non-Blocking 방식 모두 가능하다.

채널(Channel)?

  • 채널(Channel)은 데이터가 흘러다니는 양방향의 통로이다.
  • 채널은 Buffer를 통해서만 read, write를 할 수 있는 Buffer 방식이며 Blocking과 Non-Blocking 방식 모두 가능
  • 채널은 비동기적으로 read, write가 가능하다.

IO와 NIO의 차이점?


구분IONIO
입출력 방식스트림 방식채널 방식
버퍼 방식넌버퍼버퍼
비동기 방식지원 안함지원
블로킹/ 넌블로킹 방식블로킹 방식만 가능둘다 가능
블로킹을 나가는 방법Close StreamInterrupt & Close Stream

Non-Buffered vs Buffered

  • non-buffered 방식이란 데이터를 바로 출력 대상에 전송하는 것을 말한다.
  • buffered 방식이란 입력 데이터를 버퍼에 먼저 저장해놓고 버퍼가 가득차거나 작업이 완료될 때까지 대기한 후에 출력 작업을 수행한다.
  • buffered 방식은 입출력 작업이 빈번하지 않은 대용량 데이터를 처리할 때 효율적이다.
  • IO는 기본적으로 버퍼를 사용하지 않기 때문에 버퍼를 제공해주는 보조 스트림인 BufferedInputStream, BufferedOutputStream을 연결해 사용한다.
  • NIO는 버퍼를 사용하여 입출력을 하기 때문에 IO보다 높은 성능을 가진다.

Blocking vs Non-Blocking

  • Blocking
    • read()나 write()가 호출되면 데이터가 입력되고 출력될 때까지 스레드 블로킹 상태가 된다. 따라서 해당 작업이 끝날 때까지 기다려야하며, 그 전까지 IO 스레드 사용이 불가능하다.
    • IO의 Blocking을 빠져나오려면 스트림을 닫는 방법밖에 존재하지 않는다.
    • NIO의 Blocking은 Interrupt를 사용하여 빠져나올 수 있다.
  • Non-Blocking
    • 입출력 작업이 준비되면 채널만 선택해서 처리하면 되기 때문에 입출력 작업시 스레드가 멈추지 않는다.

Selector


Selector

  • NIO의 핵심적인 부분
  • Selector란 여러개의 채널에서 이벤트를 모니터링 할 수 있는 객체이며, 하나의 스레드에서 여러 채널에 대한 모니터링이 가능하다.
  • 즉, Selector를 사용하여 하나의 스레드가 여러 채널을 처리할 수 있다.
  • Selector를 사용하기 위해 하나 이상의 채널을 Selector에 등록하고 select() 메서드를 호출하면 등록된 채널 중 입/출력 이벤트 준비가 완료된 하나 이상의 채널이 생길 때까지 block 상태가 된다. 이 후 조건을 충족하는 채널이 생겨 메서드가 반환되면 스레드는 준비가 완료된 채널에서 이벤트를 처리할 수 있다.
참고
This post is licensed under CC BY 4.0 by the author.