본문 바로가기
STUDY/Search

12. io와 nio의 차이점

by eungSe__ 2024. 5. 21.

https://dev-coco.tistory.com/42

https://velog.io/@jihoson94/BIO-vs-NIO

https://blog.naver.com/rain483/220636709530

 

👀 io
블로킹 방식
Blocking API란 API를 호출한 Thread가 API의 작업이 끝날 때까지 다른 동작을 하지않는 API를 블록킹이라고 합니다.
하나의 thread가 read() or write()를 발생시킬때, 해당 thread는 데이터를 읽을 때까지 혹은 데이터를 적을때까지 blocked. 막혀있습니다.
Blocking API들은 반환값을 받을 때까지(작업이 끝날 때) Blocking 되기 때문에 해당 Thread는 idle상태로 유지되게 됩니다. -
IO 스레드가 블로킹되면 다른 일을 할 수 없고 블로킹을 빠져나오기 위해 인터럽트(Interrupt)도할 수 없다


Stream 기반
IO는 스트림 기반 => 스트림은 입력 스트림과 출력 스트림이 구분되어 있움
 데이터를 읽기 위해 입력 스트림을 생성, 데이터 출력 위해 출력 스트림 생성 해야함

넌버퍼
IO 에서는 출력 스트림이 1바이트를 쓰면 입력 스트림이 1바이트를 읽음.
  => 이런 시스템은 대체로 느림
버퍼를 제공하늦 보조스트림 이용하기도 함

 

비동기방식 지원x
데이터의 입/출력 작업이 진행되는 동안 프로그램은 다른 작업을 진행하지 않고 기다립니다. 가장 간단하고 직관적인 방식이지만, I/O 작업이 오래 걸리는 경우 프로그램의 효율성이 크게 저하될 수 있습니다.

 

👀 Nio
넌블로킹 ,블로킹 모두 지원
Non-Blocking API는 쉽게 말해 API호출시 요청한 작업의 완료 여부와 상관없이 즉각적으로 현재 상태에 대한 응답이 옵니다. 그래서 API 호출 후 Thread 제어권이 있기 때문에 다른 작업을 진행할 수 있습니다.
thread가 channel을 통해 데이터를 읽는 것을 요청하고 오직 현재 이용가능한 데이터만을 얻을 수도 있고 만약 이용할 수 있는 데이터 없다면 아무것도 돌려주지 않는 동작을 즉시 할 수 있게합니다. (스레드가 Blocking되지않습니다.)-빠름

입출력 작업 준비가 완료된 채널만 선택해서 작업 스레드가 처리하므로 작업 스레드가 블로킹되지 않음

 

비동기방식 지원
NIO는 불특정 다수의 클라이언트 연결 또는 멀티 파일들을 넌블로킹이나 비동기로 처리할 수잇다

비동기 I/O는 프로그램이 I/O 작업을 요청하고, 그 작업이 완료되기를 기다리지 않고 즉시 다음 작업으로 넘어가는 방식입니다. 이 경우, I/O 작업이 끝날 때까지 다른 작업을 계속해서 진행할 수 있어 효율성이 높습니다. 비동기 I/O는 복잡성이 증가하지만, 특히 대용량 데이터를 처리하거나 여러 I/O 작업을 동시에 처리해야 할 때 유용합니다.

 NIO 는 채널 기반 => 채널은 스트림과는 다르게 양방향 입출력 가능 -입력과 출력을 위한 별도의 채널을 만들 필요 없음.

버퍼
  NIO는 기본적으로 버퍼를 사용하여 입출력을 함 => IO보다 성능이 좋음. 
     채널은 버퍼에 저장된 데이를 출력흐고 입력된 데이터를 버퍼에 저장.
=> 데이터의 위치르 이동해 가며 필요한 부분만 읽고 쓸 수  있음

👀


연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있는 경우 
IO로 서버를 구현하는 것이 좋음.
NIO는 연결 클라이언트 수가 많고 하나의 입출력 처리 작업이 오래걸리지 않는 경우에 사용하는 것이 좋음

'STUDY > Search' 카테고리의 다른 글

10. SPA / 11. CLI,CDN  (0) 2024.05.10
9. 아스키(ascii) 코드/바이너리(binary) 코드/마미(Mime) 코드?  (0) 2024.05.08
🔍search list  (0) 2024.04.21