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의 차이점?
구분 | IO | NIO |
---|---|---|
입출력 방식 | 스트림 방식 | 채널 방식 |
버퍼 방식 | 넌버퍼 | 버퍼 |
비동기 방식 | 지원 안함 | 지원 |
블로킹/ 넌블로킹 방식 | 블로킹 방식만 가능 | 둘다 가능 |
블로킹을 나가는 방법 | Close Stream | Interrupt & 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
- NIO의 핵심적인 부분
- Selector란 여러개의 채널에서 이벤트를 모니터링 할 수 있는 객체이며, 하나의 스레드에서 여러 채널에 대한 모니터링이 가능하다.
- 즉, Selector를 사용하여 하나의 스레드가 여러 채널을 처리할 수 있다.
- Selector를 사용하기 위해 하나 이상의 채널을 Selector에 등록하고 select() 메서드를 호출하면 등록된 채널 중 입/출력 이벤트 준비가 완료된 하나 이상의 채널이 생길 때까지 block 상태가 된다. 이 후 조건을 충족하는 채널이 생겨 메서드가 반환되면 스레드는 준비가 완료된 채널에서 이벤트를 처리할 수 있다.
참고
참고 [미니 블로그]: https://otrodevym.tistory.com/entry/java-기초-19-NIO-기반-입출력-및-네트워킹
참고 [자바니또의 Tech상자]: https://javanitto.tistory.com/11
참고 [JongMin]: https://jongmin92.github.io/2019/03/03/Java/java-nio/