NIO는 IO 작업의 단점을 보완하기 위해 탄생했습니다. NIO의 새로운 기능 중 일부는 Non-Blocking I/O, 선택기, 버퍼 및 파이프입니다. 채널, 버퍼, 선택기가 주요 기능입니다.
개념 설명:
채널 - 파이프는 실제로 기존 IO의 스트림과 같습니다. 모든 대상(또는 어디에서든)으로의 모든 데이터는 채널 개체를 통과해야 합니다. 버퍼는 본질적으로 컨테이너 개체입니다.
선택기 - 선택기는 여러 파이프의 이벤트를 수신하는 데 사용됩니다. 기존 차단 IO를 사용하면 읽기 및 쓰기가 언제 수행되는지 쉽게 알 수 있습니다. 그러나 비차단 채널을 사용하면 몇 가지 방법이 필요합니다. 채널이 준비되면 이러한 요구에 맞게 선택기가 탄생했습니다.
NIO와 기존 IO의 차이점은 무엇인가요?
1. IO는 스트림 지향이고 NIO는 블록(버퍼) 지향입니다.
IO 스트림 기반 작업은 한 번에 1바이트씩 데이터를 처리합니다. 입력 스트림은 1바이트의 데이터를 생성하고 출력 스트림은 1바이트의 데이터를 사용합니다. , 결과적으로 데이터 읽기 및 쓰기 효율성이 저하됩니다.
NIO 블록 지향 작업은 한 단계로 데이터 블록을 생성하거나 소비합니다. 청크 단위로 데이터를 처리하는 것은 (스트리밍) 바이트 단위로 데이터를 처리하는 것보다 훨씬 빠르며, 데이터는 나중에 처리할 버퍼로 읽혀지고 필요에 따라 버퍼에서 앞뒤로 이동할 수 있습니다. 이는 처리의 유연성을 증가시킵니다. 평신도의 관점에서 NIO는 "사전 읽기" 방식을 채택합니다. 데이터의 특정 부분을 읽으면 다음에 읽을 데이터를 추측하여 미리 버퍼링합니다.
2. IO는 차단되고 NIO는 차단되지 않습니다.
기존 IO의 경우 스레드가 read() 또는 write()를 호출하면 일부 데이터를 읽거나 데이터가 완전히 기록될 때까지 스레드가 차단됩니다. 이 기간 동안 스레드는 다른 작업을 수행할 수 없습니다.
NIO의 경우 스레드는 응답을 받기 전에 응답이 완료되기를 기다리는 대신 다른 작업을 수행하는 데 사용됩니다. IO처럼요.
NIO 및 IO 적용 시나리오
NIO는 기존 IO의 단점을 보완하기 위해 탄생했지만 NIO는 버퍼 중심이라는 점에서 단점도 있고 장점도 있습니다. 연산, 모든 데이터 처리가 버퍼에서 수행되면 문제가 발생합니다. 데이터 처리 전에 버퍼의 데이터가 완료되었는지 또는 읽혔는지 여부를 판단해야 합니다. 부분을 읽었다면 불완전한 데이터를 처리할 필요가 없습니다. 따라서 각 데이터 처리 전에 버퍼 데이터를 감지해야 합니다.
그럼 NIO와 IO에 적용 가능한 시나리오는 무엇인가요?
동시에 열리는 수천 개의 연결을 관리해야 하고 이러한 연결이 채팅 서버와 같이 매번 소량의 데이터만 전송하는 경우 NIO를 사용하여 데이터를 처리하는 것은 좋은 선택.
연결 수가 적고 이러한 연결이 매번 많은 양의 데이터를 전송해야 하는 경우 기존 IO가 더 적합합니다. 어떤 방식으로 데이터를 처리할 것인지는 데이터의 응답 대기 시간과 버퍼 데이터를 확인하는 시간을 고려하여 판단해야 합니다.
인기 있는 설명
마지막으로 NIO와 기존 IO에 대해 한 네티즌이 언급한 생생한 예가 있습니다.
이전 스트림은 항상 차단되었으며 스레드만 필요했습니다. 작업을 수행하면 다른 작업이 차단되며 이는 밸브가 없는 송수관과 같습니다. 물을 받으려고 손을 뻗으면 물이 도착하든 안 나오든 물을 받는 데만 시간을 보낼 수 있습니다. 흐름).
nio의 채널 추가는 수도꼭지(밸브 포함)를 추가하는 것과 같습니다. 한 번에 하나의 수도관에서만 물을 받을 수 있지만 물의 양이 많지 않을 때 회전 전략에 의존합니다. 크면 각 수도관에 흐르는 물을 제대로 받을 수 있게 되는데 관건은 물 수집기, 즉 물이 있으면 그 조정을 담당하는 것입니다. 현재 수도관의 물이 일정 수준에 도달하면 스위치를 전환하십시오. 현재 수도꼭지를 일시적으로 닫고 다른 수도꼭지를 열어보십시오(물이 있는지 확인).
다른 사람들은 물이 필요할 때 직접 물을 모으러 가지 않고 미리 물통을 제공합니다. 즉, 다른 사람들은 기다려야 할지라도 현장에서 기다리지 않고 집에 가서
다른 일을 할 수 있습니다. 그들에게 알릴 것입니다.
이것은 실제로 현재의 사회적 분업의 현실에 매우 가깝습니다. 또한 매 단계마다 병렬 처리를 수행하는 것보다 기존 자원을 사용하여 동시 효과를 달성하는 매우 경제적인 방법이기도 합니다. 가장 효과적인 방법이지만
자원을 가장 낭비하는 방법이기도 합니다.
위 내용은 Java에서 NIO와 IO의 차이점과 적용 가능한 시나리오의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!