이 기사에서는 Node의 다양한 I/O 모델에 대해 설명하고 노드의 핵심인 비차단 비동기 IO를 소개합니다. 모든 사람에게 도움이 되기를 바랍니다.
[관련 튜토리얼 권장 사항: nodejs 비디오 튜토리얼, 프로그래밍 교육]
네트워크 요청 IO를 예로 들어, 먼저 전체 네트워크 IO 요청을 처리하는 서버의 일반적인 프로세스를 소개합니다.
응용 프로그램은 일반적으로 두 가지 다른 단계를 포함하는 작업 결과를 얻습니다.
데이터가 준비될 때까지 대기
아래에서는 recvfrom
함수를 다양한 IO를 설명하는 예 Model
Blocking call은 호출 결과가 반환되기 전에 현재 스레드가 일시 중지되고 호출 스레드가 시스템 커널 수준에서 모든 작업을 기다리세요 통화는 완료될 때까지 종료되지 않습니다.
I/O를 차단하면 CPU가 I/O를 기다리게 되어 CPU 시간 조각이 낭비됩니다.
전자와 비교하여 non-blocking I/O는 데이터를 얻지 않고 직접 반환합니다. 파일 설명자 데이터를 다시 읽으려고
비차단 호출을 시도하고 반환(실제 예상 데이터가 아님)을 받은 후 CPU 타임 슬라이스를 사용하여 다른 작업을 처리할 수 있으므로 성능이 크게 향상될 수 있습니다.
하지만 그에 따른 문제는 이전 작업이 완전한 I/O가 아니었고 반환된 결과도 예상했던 비즈니스 데이터가 아닌 비동기 호출 상태뿐이라는 것입니다. 완전한 데이터를 얻으려면 애플리케이션은 작업이 완료되었는지 확인하기 위해 IO 작업을 반복적으로 호출해야 합니다. 이 작업을폴링이라고 합니다. 몇 가지 일반적인 폴링 전략은 다음과 같습니다.
select
poll
epoll/kqueue
sleep입니다. 실제로 이벤트 알림을 활용하고 (파일 설명자) 쿼리를 탐색하는 대신 콜백을 실행하므로 CPU가 낭비되지 않습니다
요약: 기본적으로 폴링은 여전히 동기 작업입니다. 왜냐하면 애플리케이션은 여전히 I/O가 완전히 반환되기를 기다리고 있기 때문입니다. 대기 기간 동안 파일 설명 상태를 순회하거나 이벤트가 발생할 때까지 대기합니다. .
Signal-driven I/O 모델에서는 애플리케이션이 신호를 사용하여 I/O를 구동하고 신호 처리 기능을 설치합니다. 프로세스는 차단 없이 계속 실행됩니다.
데이터가 준비되면 프로그램은 SIGIO 신호를 수신하고 신호 처리 함수에서 I/O 작업 함수를 호출하여 데이터를 처리할 수 있습니다.
요약: 지금까지 신호 중심 I/O 모델은 비동기 요구 사항에 더 부합합니다. 프로그램은 데이터를 기다리는 동안 다른 비즈니스 로직을 비동기적으로 실행합니다.
하지만! ! ! 커널에서 사용자 공간으로 데이터를 복사하는 과정에서는 여전히 차단되어 있으며 이는 완전한 혁명(비동기)이 아닙니다.
우리의 이상적인 비동기 I/O는 폴링을 통해 데이터를 얻을 필요 없이 애플리케이션에 의해 시작된 비차단 호출이어야 하며, 불필요하게 기다리는 대신 I/O가 완료된 후 신호 또는 콜백 함수를 통해 애플리케이션에 데이터를 전달할 수 있으며, 그 동안 애플리케이션은 다른 비즈니스 로직을 실행할 수 있습니다.
사실 리눅스 플랫폼은 기본적으로 비동기 I/O(AIO)를 지원하지만 현재 AIO는 완벽하지 않기 때문에 리눅스에서 동시성이 높은 네트워크 프로그래밍을 구현할 때 주로 I/O를 사용한다. 재사용 모델.
Windows에서는 IOCP를 통해 진정한 비동기 I/O가 구현됩니다.
Linux 플랫폼에서 Node는 스레드 풀을 사용하여 일부 스레드가 차단 I/O 또는 비차단 I/O + 폴링을 수행하도록 하여 데이터 수집을 완료합니다. 단일 스레드는 스레드 간 통신을 통해 계산을 수행하고 I/O 결과를 전송하므로 비동기 I/O 시뮬레이션을 실현합니다.
실제로 Windows 플랫폼에서 IOCP 비동기 및 비동기 솔루션의 하위 계층도 스레드 풀을 사용하여 구현됩니다. 차이점은 후자의 스레드 풀이 시스템 커널에 의해 호스팅된다는 것입니다.
우리는 종종 Node가 단일 스레드라고 말하지만 실제로는 JS가 단일 스레드에서 실행된다고 말할 수 있습니다. *nix든 Windows 플랫폼이든 하위 계층은 스레드 풀을 사용합니다. I/O 작업을 완료합니다.
노드 관련 지식을 더 보려면 nodejs 튜토리얼을 방문하세요!
위 내용은 Nodejs의 비차단 비동기 IO에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!