>웹 프론트엔드 >JS 튜토리얼 >Nodejs의 비차단 비동기 IO에 대해 알아보세요.

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

青灯夜游
青灯夜游앞으로
2022-12-07 18:12:222470검색

이 기사에서는 Node의 다양한 I/O 모델에 대해 설명하고 노드의 핵심인 비차단 비동기 IO를 소개합니다. 모든 사람에게 도움이 되기를 바랍니다.

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

[관련 튜토리얼 권장 사항: nodejs 비디오 튜토리얼, 프로그래밍 교육]

네트워크 요청 IO를 예로 들어, 먼저 전체 네트워크 IO 요청을 처리하는 서버의 일반적인 프로세스를 소개합니다.

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

응용 프로그램은 일반적으로 두 가지 다른 단계를 포함하는 작업 결과를 얻습니다.

  • 데이터가 준비될 때까지 대기

  • 커널에서 프로세스로 데이터 복사

아래에서는 recvfrom 함수를 다양한 IO를 설명하는 예 Model

Blocking I/O 모델(I/O 차단)

Blocking call은 호출 결과가 반환되기 전에 현재 스레드가 일시 중지되고 호출 스레드가 시스템 커널 수준에서 모든 작업을 기다리세요 통화는 완료될 때까지 종료되지 않습니다.

I/O를 차단하면 CPU가 I/O를 기다리게 되어 CPU 시간 조각이 낭비됩니다.

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

Non-blocking I/O 모델(non-blocking I/O)

전자와 비교하여 non-blocking I/O는 데이터를 얻지 않고 직접 반환합니다. 파일 설명자 데이터를 다시 읽으려고

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

비차단 호출을 시도하고 반환(실제 예상 데이터가 아님)을 받은 후 CPU 타임 슬라이스를 사용하여 다른 작업을 처리할 수 있으므로 성능이 크게 향상될 수 있습니다.

하지만 그에 따른 문제는 이전 작업이 완전한 I/O가 아니었고 반환된 결과도 예상했던 비즈니스 데이터가 아닌 비동기 호출 상태뿐이라는 것입니다.

완전한 데이터를 얻으려면 애플리케이션은 작업이 완료되었는지 확인하기 위해 IO 작업을 반복적으로 호출해야 합니다. 이 작업을

폴링이라고 합니다. 몇 가지 일반적인 폴링 전략은 다음과 같습니다.

Busy Polling

이는 가장 원시적이고 성능이 가장 낮은 방법입니다. 반복 호출을 통해 I/O 상태를 확인하여 완전한 데이터를 얻습니다

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

장점: 간단한 프로그래밍

단점: 폴링 시 CPU가 항상 소모됩니다.

I/O 다중화 모델(I/O 다중화)

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

I/O 다중화 모델에서는 Select 또는 Poll 기능 또는 Epoll 기능(에서 지원됨) Linux 커널 2.6 이후), 이 두 함수는 프로세스도 차단하지만 I/O 차단과는 다릅니다.

이 세 가지 함수는 동시에 여러 I/O 작업을 차단할 수 있으며 동시에 여러 읽기 작업과 여러 쓰기 작업의 I/O 기능을 감지할 수 있습니다. I/O 작업 기능을 읽거나 씁니다.

세 가지 I/O 다중화 메커니즘의 차이점은 다음과 같습니다.

  • select

select는 1024 길이의 배열을 사용하여 파일 상태를 저장하므로 최대 1024개의 파일 설명자를 동시에 감지할 수 있습니다. time

  • poll

연결 목록을 사용하면 1024의 길이 제한을 피하고 불필요한 순회 검사를 피할 수 있어 선택 성능이 약간 향상됩니다

  • epoll/kqueue

은 Linux에서 가장 효율적인 I/O 이벤트 알림 메커니즘입니다. 폴링 중에 I/O 이벤트가 감지되지 않으면 이벤트가 발생하고 스레드가 깨어날 때까지

sleep입니다. 실제로 이벤트 알림을 활용하고 (파일 설명자) 쿼리를 탐색하는 대신 콜백을 실행하므로 CPU가 낭비되지 않습니다

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

요약: 기본적으로 폴링은 여전히 ​​동기 작업입니다. 왜냐하면 애플리케이션은 여전히 ​​I/O가 완전히 반환되기를 기다리고 있기 때문입니다. 대기 기간 동안 파일 설명 상태를 순회하거나 이벤트가 발생할 때까지 대기합니다. .

Signal-driven I/O 모델(signal-driven I/O)

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

Signal-driven I/O 모델에서는 애플리케이션이 신호를 사용하여 I/O를 구동하고 신호 처리 기능을 설치합니다. 프로세스는 차단 없이 계속 실행됩니다.

데이터가 준비되면 프로그램은 SIGIO 신호를 수신하고 신호 처리 함수에서 I/O 작업 함수를 호출하여 데이터를 처리할 수 있습니다.

요약: 지금까지 신호 중심 I/O 모델은 비동기 요구 사항에 더 부합합니다. 프로그램은 데이터를 기다리는 동안 다른 비즈니스 로직을 비동기적으로 실행합니다.

하지만! ! ! 커널에서 사용자 공간으로 데이터를 복사하는 과정에서는 여전히 차단되어 있으며 이는 완전한 혁명(비동기)이 아닙니다.

이상적인(노드) 비차단 비동기 I/O

우리의 이상적인 비동기 I/O는 폴링을 통해 데이터를 얻을 필요 없이 애플리케이션에 의해 시작된 비차단 호출이어야 하며, 불필요하게 기다리는 대신 I/O가 완료된 후 신호 또는 콜백 함수를 통해 애플리케이션에 데이터를 전달할 수 있으며, 그 동안 애플리케이션은 다른 비즈니스 로직을 실행할 수 있습니다.

Nodejs의 비차단 비동기 IO에 대해 알아보세요.

실제 비동기 I/O

사실 리눅스 플랫폼은 기본적으로 비동기 I/O(AIO)를 지원하지만 현재 AIO는 완벽하지 않기 때문에 리눅스에서 동시성이 높은 네트워크 프로그래밍을 구현할 때 주로 I/O를 사용한다. 재사용 모델.

Windows에서는 IOCP를 통해 진정한 비동기 I/O가 구현됩니다.

비동기 I/O의 다중 스레드 시뮬레이션

Linux 플랫폼에서 Node는 스레드 풀을 사용하여 일부 스레드가 차단 I/O 또는 비차단 I/O + 폴링을 수행하도록 하여 데이터 수집을 완료합니다. 단일 스레드는 스레드 간 통신을 통해 계산을 수행하고 I/O 결과를 전송하므로 비동기 I/O 시뮬레이션을 실현합니다.

실제로 Windows 플랫폼에서 IOCP 비동기 및 비동기 솔루션의 하위 계층도 스레드 풀을 사용하여 구현됩니다. 차이점은 후자의 스레드 풀이 시스템 커널에 의해 호스팅된다는 것입니다.

우리는 종종 Node가 단일 스레드라고 말하지만 실제로는 JS가 단일 스레드에서 실행된다고 말할 수 있습니다. *nix든 Windows 플랫폼이든 하위 계층은 스레드 풀을 사용합니다. I/O 작업을 완료합니다.

노드 관련 지식을 더 보려면 nodejs 튜토리얼을 방문하세요!

위 내용은 Nodejs의 비차단 비동기 IO에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제