목차
처음부터 시작합시다
공통 웹 애플리케이션이 수행할 작업
전형적인 기존 웹 애플리케이션 구현
방해가 무엇인가요? I/O 차단이란 무엇입니까?
다중 스레드 + 블로킹 I/O 모델에 어떤 문제가 있나요?
nodejs 애플리케이션 구현
기본 읽기 작업 단계
几种I/O模型
nodejs体系结构,线程、I/O模型分析
总结
웹 프론트엔드 JS 튜토리얼 Node의 높은 동시성 원칙에 대한 간략한 분석

Node의 높은 동시성 원칙에 대한 간략한 분석

Oct 18, 2022 pm 08:53 PM
nodejs node 높은 동시성

Node의 높은 동시성 원칙에 대한 간략한 분석

먼저 몇 가지 일반적인 설명을 살펴보겠습니다.

  • nodejs는 단일 스레드 + 비차단 I/O 모델입니다.
  • nodejs는 높은 동시성에 적합합니다.
  • nodejs는 I/O 집약적 애플리케이션에 적합합니다. CPU 집약적이지 않은 애플리케이션 [관련 튜토리얼 추천: nodejs 비디오 튜토리얼]

이 진술이 사실인지, 그 이유를 자세히 분석하기 전에 몇 가지 준비 작업을 합시다

처음부터 시작합시다

공통 웹 애플리케이션이 수행할 작업

  • 작업(비즈니스 로직 실행, 수학 연산, 함수 호출 등. 주요 작업은 CPU에서 수행됨)
  • I/O(예: 파일 읽기 및 쓰기, 데이터베이스 읽기 및 쓰기) , 네트워크 요청 읽기 및 쓰기 등 주요 작업은 디스크, 네트워크 카드 등과 같은 다양한 I/O 장치에서 수행됩니다.)

전형적인 기존 웹 애플리케이션 구현

  • 다중 프로세스 , 하나의 요청은 (하위) 프로세스 + 차단 I/O(예: I/O 또는 BIO 차단)를 분기합니다.
  • 멀티 스레딩, 하나의 요청은 스레드 + 차단 I/O를 생성합니다.

다중 프로세스 웹 애플리케이션 예시 의사 code

listenFd = new Socket(); // 创建监听socket
Bind(listenFd, 80); // 绑定端口
Listen(listenFd);   // 开始监听

for ( ; ; ) {
    // 接收客户端请求,通过新的socket建立连接
    connFd = Accept(listenFd);
    // fork子进程
    if ((pid = Fork()) === 0) {
        // 子进程中
        // BIO读取网络请求数据,阻塞,发生进程调度
        request = connFd.read();
        // BIO读取本地文件,阻塞,发生进程调度
        content = ReadFile('test.txt');
        // 将文件内容写入响应
        Response.write(content);
    }
}
로그인 후 복사

멀티 스레드 응용 프로그램은 하나의 요청이 하나의 프로세스에 할당된다는 점을 제외하면 실제로 다중 프로세스와 유사합니다. 스레드를 할당하라는 요청이 됩니다. 스레드는 프로세스보다 가볍고 시스템 리소스를 덜 차지합니다. 컨텍스트 전환(ps: 소위 컨텍스트 전환, 약간의 설명: 단일 코어 CPU는 동시에 하나의 프로세스 또는 스레드에서만 작업을 실행할 수 있습니다. 매크로의 인터넷 병렬화에서는 각 프로세스와 스레드가 실행될 기회를 갖도록 시간 분할에 따라 여러 프로세스 또는 스레드 간에 전환해야 합니다.) 동시에 오버헤드도 더 적습니다. 개발을 용이하게 하는 스레드 간 메모리 공유

Up 기사에서는 웹 애플리케이션의 두 가지 핵심 사항을 언급했는데, 하나는 스레드 모델이고 다른 하나는 I/O 모델입니다. 그렇다면 I/O를 차단하는 것이 정확히 무엇입니까? 다른 I/O 모델에는 어떤 것이 있나요? 걱정하지 마세요. 먼저 방해가 무엇인지 살펴보겠습니다

방해가 무엇인가요? I/O 차단이란 무엇입니까?

간단히 말하면, 차단이란 함수 호출이 반환되기 전에 현재(스레드) 프로세스가 일시 중지되고 대기 상태로 진입한다는 의미입니다. 이 상태에서는 현재(스레드) 프로세스가 일시 중지되고 CPU가 스레드(스레드)를 처리하게 됩니다. ) 스레드 스케줄링. 함수는 모든 내부 작업이 완료된 후에만 호출자에게 반환됩니다

따라서 I/O 차단은 애플리케이션이 API를 통해 I/O 작업을 호출한 후 현재(스레드) 스레드가 대기 상태로 들어가고 코드가 실행된다는 의미입니다. 실행을 계속할 수 없습니다. 이때 CPU는 스레드(스레드) 스케줄링을 수행할 수 있습니다. 즉, 실행을 계속하려면 현재 스레드(스레드)가 반환됩니다.

다중 스레드 + 블로킹 I/O 모델에 어떤 문제가 있나요?

블로킹과 블로킹 I/O가 무엇인지 이해한 후, 기존 웹 애플리케이션의 다중 프로세스(스레드) + 블로킹 I/O 모델의 단점을 분석해 보겠습니다.

요청에는 들어오는(스레드) 스레드가 할당되어야 하기 때문에 이러한 시스템은 동시성이 클 때 많은 수의 들어오는(스레드) 스레드를 유지해야 하며 많은 수의 컨텍스트 전환이 필요합니다. 많은 양의 CPU, 메모리 및 기타 시스템 리소스를 지원하므로 동시 요청이 많이 들어오면 CPU 및 메모리 오버헤드가 급격히 증가하여 전체 시스템이 빠르게 중단되고 서비스를 사용할 수 없게 될 수 있습니다

nodejs 애플리케이션 구현

다음으로 nodejs 애플리케이션이 어떻게 구현되는지 살펴보겠습니다.

  • 이벤트 중심, 단일 스레드(메인 스레드)
  • 비차단 I/O 공식 웹사이트에서 볼 수 있듯이 nodejs의 두 가지 주요 기능은 단일 스레드 이벤트 중심 및 "비차단" I/O 모델입니다. 단일 스레드 + 이벤트 기반은 이해하기 더 쉽습니다. 프론트엔드 학생들은 js의 단일 스레드 및 이벤트 루프 메커니즘에 익숙해야 하므로 주로 이 "비차단 I/O"가 무엇인지 살펴보겠습니다. 먼저 nodejs 서버 애플리케이션의 공통 코드를 살펴보겠습니다.
const net = require('net');
const server = net.createServer();
const fs = require('fs');

server.listen(80);  // 监听端口
// 监听事件建立连接
server.on('connection', (socket) => {
    // 监听事件读取请求数据
    socket.on('data', (data) => {
    // 异步读取本地文件
    fs.readFile('test.txt', (err, data) => {
            // 将读取的内容写入响应
            socket.write(data);
            socket.end();
        })
    });
});
로그인 후 복사

nodejs에서는 API를 통해 I/O 작업을 호출한 후 비동기 방식으로 I/O 작업을 수행할 수 있음을 알 수 있습니다. 즉시 다른 코드 로직을 계속 실행할 수 있는데 nodejs의 I/O가 "비차단"인 이유는 무엇입니까? 이 질문에 답하기 전에 몇 가지 준비 작업을 해보겠습니다. nodejs 고급 동영상 설명을 참조하세요. Enter learning

기본 읽기 작업 단계

먼저 다음 읽기 작업에 필요한 단계를 살펴보겠습니다

  • 用户程序调用I/O操作API,内部发出系统调用,进程从用户态转到内核态
  • 系统发出I/O请求,等待数据准备好(如网络I/O,等待数据从网络中到达socket;等待系统从磁盘上读取数据等)
  • 数据准备好后,复制到内核缓冲区
  • 从内核空间复制到用户空间,用户程序拿到数据

接下来我们看一下操作系统中有哪些I/O模型

几种I/O模型

阻塞式I/O

Node의 높은 동시성 원칙에 대한 간략한 분석


非阻塞式I/O

Node의 높은 동시성 원칙에 대한 간략한 분석


I/O多路复用(进程可同时监听多个I/O设备就绪)

Node의 높은 동시성 원칙에 대한 간략한 분석


信号驱动I/O

Node의 높은 동시성 원칙에 대한 간략한 분석


异步I/O

Node의 높은 동시성 원칙에 대한 간략한 분석


那么nodejs里到底使用了哪种I/O模型呢?是上图中的“非阻塞I/O”吗?别着急,先接着往下看,我们来了解下nodejs的体系结构

nodejs体系结构,线程、I/O模型分析

Node의 높은 동시성 원칙에 대한 간략한 분석

最上面一层是就是我们编写nodejs应用代码时可以使用的API库,下面一层则是用来打通nodejs和它所依赖的底层库的一个中间层,比如实现让js代码可以调用底层的c代码库。来到最下面一层,可以看到前端同学熟悉的V8,还有其他一些底层依赖。注意,这里有一个叫libuv的库,它是干什么的呢?从图中也能看出,libuv帮助nodejs实现了底层的线程池、异步I/O等功能。libuv实际上是一个跨平台的c语言库,它在windows、linux等不同平台下会调用不同的实现。我这里主要分析linux下libuv的实现,因为我们的应用大部分时候还是运行在linux环境下的,且平台间的差异性并不会影响我们对nodejs原理的分析和理解。好了,对于nodejs在linux下的I/O模型来说,libuv实际上提供了两种不同场景下的不同实现,处理网络I/O主要由epoll函数实现(其实就是I/O多路复用,在前面的图中使用的是select函数来实现I/O多路复用,而epoll可以理解为select函数的升级版,这个暂时不做具体分析),而处理文件I/O则由多线程(线程池) + 阻塞I/O模拟异步I/O实现


下面是一段我写的nodejs底层实现的伪代码帮助大家理解

listenFd = new Socket();    // 创建监听socket
Bind(listenFd, 80); // 绑定端口
Listen(listenFd);   // 开始监听

for ( ; ; ) {
    // 阻塞在epoll函数上,等待网络数据准备好
    // epoll可同时监听listenFd以及多个客户端连接上是否有数据准备就绪
    // clients表示当前所有客户端连接,curFd表示epoll函数最终拿到的一个就绪的连接
    curFd = Epoll(listenFd, clients);

    if (curFd === listenFd) {
        // 监听套接字收到新的客户端连接,创建套接字
        int connFd = Accept(listenFd);
        // 将新建的连接添加到epoll监听的list
        clients.push(connFd);
    }

    else {
        // 某个客户端连接数据就绪,读取请求数据
        request = curFd.read();
        // 这里拿到请求数据后可以发出data事件进入nodejs的事件循环
        ...
    }
}

// 读取本地文件时,libuv用多线程(线程池) + BIO模拟异步I/O
ThreadPool.run((callback) => {
    // 在线程里用BIO读取文件
    String content = Read('text.txt');  
    // 发出事件调用nodejs提供的callback
});
로그인 후 복사

通过I/O多路复用 + 多线程模拟的异步I/O配合事件循环机制,nodejs就实现了单线程处理并发请求并且不会阻塞。所以回到之前所说的“非阻塞I/O”模型,实际上nodejs并没有直接使用通常定义上的非阻塞I/O模型,而是I/O多路复用模型 + 多线程BIO。我认为“非阻塞I/O”其实更多是对nodejs编程人员来说的一种描述,从编码方式和代码执行顺序上来讲,nodejs的I/O调用的确是“非阻塞”的

总结

至此我们应该可以了解到,nodejs的I/O模型其实主要是由I/O多路复用和多线程下的阻塞I/O两种方式一起组成的,而应对高并发请求时发挥作用的主要就是I/O多路复用。好了,那最后我们来总结一下nodejs线程模型和I/O模型对比传统web应用多进(线)程 + 阻塞I/O模型的优势和劣势

  • nodejs는 단일 스레드 모델을 사용하여 시스템 유지 관리 및 다중 스레드 전환 비용을 절약하는 동시에 다중화 I/O 모델은 nodejs의 단일 스레드가 특정 연결에서 차단되는 것을 방지할 수 있습니다. 동시성이 높은 시나리오에서 nodejs 애플리케이션은 해당 프로세스나 스레드를 생성하지 않고 여러 클라이언트 연결에 해당하는 소켓 설명자만 생성하고 관리하면 됩니다. 시스템 오버헤드가 크게 줄어들므로 동시에 더 많은 클라이언트 연결을 처리할 수 있습니다
  • Nodejs는 불가능합니다. 기본 실제 I/O 작업의 효율성을 향상시킵니다. 기본 I/O가 시스템의 성능 병목 현상을 일으키는 경우 nodejs는 여전히 이를 해결할 수 없습니다. 즉, nodejs는 높은 동시 요청을 받을 수 있지만, 읽기 및 읽기와 같은 많은 수의 느린 I/O 작업을 처리해야 하는 경우입니다. 디스크 쓰기) 여전히 시스템 리소스 과부하가 발생할 수 있습니다. 따라서 단일 스레드 + 비차단 I/O 모델로는 단순히 높은 동시성을 해결할 수 없습니다.
  • CPU 집약적인 애플리케이션은 nodejs의 단일 스레드 모델을 성능 병목 현상으로 만들 수 있습니다.
  • nodejs는 높은 동시성 처리에 적합합니다. 소량의 비즈니스 로직 또는 빠른 I/O(예: 읽기 및 쓰기 메모리)

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

위 내용은 Node의 높은 동시성 원칙에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nodejs는 백엔드 프레임워크인가요? nodejs는 백엔드 프레임워크인가요? Apr 21, 2024 am 05:09 AM

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

nodejs를 mysql 데이터베이스에 연결하는 방법 nodejs를 mysql 데이터베이스에 연결하는 방법 Apr 21, 2024 am 06:13 AM

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? Apr 21, 2024 am 05:18 AM

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

nodejs의 전역 변수는 무엇입니까 nodejs의 전역 변수는 무엇입니까 Apr 21, 2024 am 04:54 AM

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

nodejs와 java 사이에 큰 차이가 있나요? nodejs와 java 사이에 큰 차이가 있나요? Apr 21, 2024 am 06:12 AM

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

nodejs는 백엔드 개발 언어인가요? nodejs는 백엔드 개발 언어인가요? Apr 21, 2024 am 05:09 AM

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

nodejs 프로젝트를 서버에 배포하는 방법 nodejs 프로젝트를 서버에 배포하는 방법 Apr 21, 2024 am 04:40 AM

Node.js 프로젝트의 서버 배포 단계: 배포 환경 준비: 서버 액세스 권한 획득, Node.js 설치, Git 저장소 설정. 애플리케이션 빌드: npm run build를 사용하여 배포 가능한 코드와 종속성을 생성합니다. Git 또는 파일 전송 프로토콜을 통해 서버에 코드를 업로드합니다. 종속성 설치: SSH를 서버에 연결하고 npm install을 사용하여 애플리케이션 종속성을 설치합니다. 애플리케이션 시작: node index.js와 같은 명령을 사용하여 애플리케이션을 시작하거나 pm2와 같은 프로세스 관리자를 사용합니다. 역방향 프록시 구성(선택 사항): Nginx 또는 Apache와 같은 역방향 프록시를 사용하여 트래픽을 애플리케이션으로 라우팅합니다.

See all articles