Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-02-07 17:56:24
앞으로
2530명이 탐색했습니다.

이 글에서는 Node의 다양한 I/O 모델에 대해 설명하고 블로킹 I/O 모델, 비블로킹 I/O 모델 및 비블로킹 비동기 I/O를 소개합니다. 모두에게 도움이 되기를 바랍니다. .

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

애플리케이션은 일반적으로 두 가지 단계를 포함하는 작업 결과를 얻습니다.

  • 데이터가 준비될 때까지 기다리는 중

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

아래에서는 recvfrom 함수를 예로 들어 다양한 IO 모델을 설명합니다.

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

Blocking call은 호출 결과가 반환되기 전에 현재 스레드가 일시 중지되고 호출 스레드는 시스템 커널 수준에서 모든 작업이 완료될 때까지 기다린 후에만 종료된다는 의미입니다. .

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

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

전자와 비교하여

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

비차단 호출

을 시도하고 반환(실제 예상 데이터가 아님)을 받은 후 CPU 타임 슬라이스를 사용하여 다른 작업을 처리할 수 있으므로 성능이 크게 향상될 수 있습니다. 하지만 그에 따른 문제는 이전 작업이 완전한 I/O가 아니었고 반환된 결과도 예상했던 비즈니스 데이터가 아닌 비동기 호출 상태뿐이라는 것입니다.

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

폴링

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

Busy Polling

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.장점: 간단한 프로그래밍

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

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.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를 낭비하지 않습니다

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.요약: 본질적으로

폴링은 여전히 ​​동기 작업입니다

. I/O가 완전히 반환될 때까지 기다립니다. 대기 기간 동안 파일 설명 상태를 탐색하거나 이벤트가 발생할 때까지 대기합니다.

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

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

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

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

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

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

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

Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.

실제 비동기 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 튜토리얼을 방문하세요!

위 내용은 Node의 다양한 I/O 모델에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!