首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

揭秘 Node.js 底层架构

Node.js 量身打造,用 C 写的跨平台异步 I/O 库,提供了非阻塞的文件系统、DNS、网络、子进程、管道、信号、轮询和流式处理机制: 对于无法在操作系统层面异步去做的工作,通过线程池来完成,...如文件 I/O、DNS 查询等,具体原因见Complexities in File I/O P.S.线程池的容量可以配置,默认是 4 个线程,具体见Thread pool work scheduling...另一方面,通过 Bindings 也可以复用可靠的老牌开源类库,而不必手搓所有底层模块 以文件 I/O 为例,读取当前 JS 文件内容并输出到标准输出: // readThisFile.js const...事件循环处理到返回事件时,对应的回调函数才在主线程开始执行,主线程在此期间继续其它工作,而不阻塞等待 Node.js 就像一家咖啡馆,店里只有一个跑堂的(主线程),一大堆顾客涌过来的时候,会排队等候(进入事件队列...),到号的顾客订单会被传给经理(libuv),经理将订单分配给咖啡师(worker 线程),咖啡师用不同的原料和工具(底层依赖的 C/C++模块)来制作订单要求的各种咖啡,一般会有 4 个咖啡师值班,高峰时候可能会增加一些

2.3K10

Node.js底层原理

前言:本文根据最近做的一次分享整理而成,希望能帮忙大家深入理解Node.js的一些原理和实现。 大家好,我是一名Node.js爱好者,今天我分享的主题是Node.js底层原理。...3 另外Node.js还维护了一个map,map的key是相对超时时间,值就是对应的二叉堆节点。 4 堆的所有节点对应底层的一个超时节点。...必要的时候,Node.js会根据js二叉堆的最快超时时间来更新底层节点的超时时间。...每个子线程本质上是一个独立的事件循环,但是所有的线程会共享底层的Libuv线程池。 ? 创建线程 接下来我们看看创建线程的过程。 ?...当我们调用new Worker创建线程的时候 1 主线程会首先创建创建两个通信的数据结构,接着往对端发送一个加载js文件的消息。 2 然后调用底层接口创建一个线程

2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Node.js底层原理

    前言:之前分享了 Node.js底层原理,主要是简单介绍了 Node.js 的一些基础原理和一些核心模块的实现,本文从 Node.js 整体方面介绍 Node.js底层原理。...定时器 Libuv 在底层里面维护了一个最小堆,每个定时节点就是堆里面的一个节点(Node.js 只用了 Libuv 的一个定时器节点),越早超时的节点就在越上面。...现在有一个底层能力,那么这个底层能力是怎么暴露给上层的 JS 去使用呢?这种时候就需要用到 JS 引擎 V8了。 3. Node.js 中的 V8 下面从三个方面介绍 V8。 1....现在有了底层能力,有了这一层的接口,但是我们是怎么去加载后执行 JS 代码呢?这时候就需要模块加载器。 4 Node.js 中的模块加载器 Node.js 中有五种模块加载器。 1....现在有了底层的能力,也有了这一次层的接口,也有了代码加载器。最后我们来看一下 Node.js 作为一个服务器的时候,它的架构是怎么样的?

    1K40

    Node.js线程完全指南

    很多人都想知道单线程Node.js 怎么能与多线程后端竞争。考虑到其所谓的单线程特性,许多大公司选择 Node 作为其后端似乎违反直觉。要想知道原因,必须理解其单线程的真正含义。...在2009年,Node.js的创始人 Ryan Dahl使开发人员可以用该语言编写后端代码。 通常支持多线程的后端语言具有各种机制,用于在线程和其他面向线程的功能之间同步数据。...接下来让我们探索一下其中的奥秘…… Node.js 是如何工作的 Node.js 使用两种线程:event loop 处理的主线程和 worker pool 中的几个辅助线程。...在 Node.js v10.5.0 发布之前就是这种情况,在这一版本增加了对多线程的支持。...简介:worker_threads worker_threads 模块允许我们创建功能齐全的多线程 Node.js 程序。

    4.2K21

    深入理解线程底层原理

    如何理解线程池的工作机制和原理? 1、线程池是用来干嘛的,用它有什么好处,怎么能更好的去用线程池? 线程池是用来干嘛的?...如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。...那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 使用线程池的好处 1)降低资源消耗。重复利用已创建线程,降低线程创建与销毁的资源消耗。...任务到达时,不需等待创建线程就能立即执行。 3)提高线程可管理性。 4)防止服务器过载。内存溢出、CPU耗尽 如何去使用线程池呢?...2)第二个参数:int maximumPoolSize (可以把这个参数当成是球队后背球员,当主力不足时才会让后备队员上场救急)线程池的最大线程数,代表着线程池中能创建多少线程池。

    40441

    iOS底层 之 多线程原理(上)

    线程是什么 线程是可以在单个应用程序中同时执行多个代码路径的几种技术之一。...该表包括线程的替代技术(例如操作对象和 GCD)以及旨在有效使用您已有的单线程的替代技术。 图1-1 线程的替代技术 线程管理:线程成本 在内存使用和性能方面,线程对您的程序(和系统)有实际成本。...线程创建时间可能会因处理器负载、计算机速度以及可用系统和程序内存量的不同而有很大差异。 图2-1 线程创建成本 注意: 由于其底层内核支持,操作对象通常可以更快地创建线程。...这两种技术都会在您的应用程序中创建一个分离的线程。分离的线程是指当线程退出时,系统会自动回收该线程的资源。...此支持使得在启动线程之前获取和设置各种线程属性成为可能。它还使得稍后可以使用该线程对象来引用正在运行的线程

    51730

    iOS底层 之 多线程原理(下)

    同步 应用程序中存在多个线程会带来有关从多个执行线程安全访问资源的潜在问题。修改同一资源的两个线程可能会以意想不到的方式相互干扰。...线程 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行;进程要想执行任务,必须得有线程,进程至少要有一条线程;程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程。...但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 4. 线程是处理器调度的基本单位,但是进程不是。 5. 线程没有地址空间,线程包含在进程地址空间中。...CPU 调度线程的时间足够快,就造成了多线程的“同时”执行的效果 如果线程数非常多 1. CPU 会在 N 个线程之间切换,消耗大量的 CPU 资源 2....但是,具体的任务内容是交给系统去做处理,再往底层是交给CPU来执行代码。那么,一个线程从创建到最后被回收,会经历什么呢?我简单整理了下图: 线程大致有 就绪、运行、阻塞、死亡这几种状态。

    52630

    Node.js进阶之进程与线程

    快速导航 进程 线程 Node.js线程与进程 Node.js 进程创建 Node.js 多进程架构模型 守护进程编写 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位...Node.js 虽然是单线程模型,但是其基于事件驱动、异步非阻塞模式,可以应用于高并发场景,避免了线程创建、线程之间上下文切换所产生的资源开销。...Web业务开发中,如果你有高并发应用场景那么 Node.js 会是你不错的选择。 在单核 CPU 系统之上我们采用 单进程+单线程 的模式来开发。...关于 Node.js 进程的几点总结 Javascript 是单线程,但是做为宿主环境的 Node.js 并非是单线程的。...Node.js 和 Nginx 均采用事件驱动方式,避免了多线程线程创建、线程上下文切换的开销。如果你的业务大多是基于 I/O 操作,那么你可以选择 Node.js 来开发。

    1.2K21

    Node.js中的进程与线程

    回顾进程和线程的定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程(Thread)是操作系统能够进行运算调度的最小单位。...Node.js的单线程 Node特点主线程是单线程的 一个进程只开一个主线程,基于事件驱动的、异步非阻塞I/O,可以应用于高并发场景。...Nodejs中没有多线程,为了充分利用多核cpu,可以使用子进程实现内核的负载均衡,那我们就要解决以下问题: Node.js 做耗时的计算时候阻塞问题。 Node.js如何开启多进程。...开启进程 Node.js 进程创建,是通过child_process模块实现的: child_process.spawn() 异步生成子进程。...5. cluster Node.js的单个实例在单个线程中运行。为了利用多核系统,用户有时会希望启动Node.js进程集群来处理负载。自己通过进程来实现集群。

    1.2K20

    【Linux】从零开始认识多线程 --- 线程概念与底层实现

    1 背景知识 1.1 再谈地址空间 1.2 页表底层 1.3 理解代码数据划分的本质 2 线程的概念 3 澄清与统一线程和进程 4 总结 4.1 线程的缺点 4.2 线程的优点 4.3 注意 1 背景知识...接下来我们就来学习页表的底层是什么样子的!!! 1.2 页表底层 物理内存中的每个物理地址一定是有对应的页的,也就是只要找到了对应页就能访问其物理地址。...但是线程也有缺陷,一个线程出错(野指针)就是这个进程出错了,因为他们使用同一个地址空间,所以其他的线程也会报错退出!!! 线程的健壮性很差!而进程是独立的互不影响!进程和线程各有特长!...编程难度提高: 编写与调试一个多线程程序比单线程程序困难得多(这个不一定) 4.2 线程的优点 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多...线程可以同时等待不同的I/O操作。 对于多线程和单线程来说,是要合适最好!对于一个2线程的CPU那么创建两个线程是最好的!

    17910

    线程-概述及底层实现机制浅析

    前言 在打算写这篇多线层底层实现机制的时候,突然发现自己对于计算机竟然懂得这么表面,对于CPU的工作原理都不完全清楚,于是又转头查看了一些CPU相关的资料。也不敢钻的太深,怕自己迷路......它是指挥者,所以最底层的一些工作并不是由CPU来完成的。...线程是进程的一部分 CPU调度的是线程 系统为进程分配资源,不对线程分配资源 进程和线程的关系: 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。...Mach是第一个以多线程方式处理任务的系统,因此多线程底层实现机制是基于Mach的线程。...感兴趣的朋友,或者说想要自己实现一套多线程方案,从底层开始定制,那么可以去搜一下相关资料研究一下。 OC的NSThread方案。

    1.1K10

    线程底层原理详解与源码分析

    另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。 【2】线程池的介绍   (1)线程池优势     1.重用存在的线程,减少线程创建,消亡的开销,提高性能     2.提高响应速度。...(2)常见线程池     1.newSingleThreadExecutor  :单个线程线程池,即线程池中每次只有一个线程工作,单线程串行执行任务     2.newFixedThreadExecutor...:可缓存线程池, 当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。     ...2)参数解析         1.corePoolSize           线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为...//默认值-536870912 说明: ctl 是对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段, 它包含两部分的信息: 线程池的运行状态 (runState) 和线程池内有效线程的数量

    38010

    Node.js 小知识 — 如何实现线程睡眠?

    为什么这里没有类似 Java 中 Thread.sleep() 这样的方式来实现线程睡眠,本文讲解如何在 Node.js 中实现一个 sleep() 函数。...一:糟糕的 “循环空转” 下面这段代码是糟糕的,Node.js 是以单进程、单线程的方式启动,所有的业务代码都工作在主线程,这样会造成 CPU 持续占用,主线程阻塞对 CPU 资源也是一种浪费,与真正的线程睡眠相差甚远...同样的因为我们的业务是工作在主线程,避免在主线程中使用,在 Node.js 的工作线程中可以根据实际需要使用。...,之后我会写一讲 Node.js 中的工作线程相关文章,到时会再次介绍。...在浏览器/Node.js 的工作线程下可以根据实际需要决定是否需要工作线程睡眠。 - 这是底线 -

    2.9K10

    字节大佬带你深入分析Node.js底层原理

    我们看到底层的实现稍微简单,但是 Node.js 的定时器模块实现就稍微复杂。 Node.js 在 JS 层维护了一个二叉堆。 堆的每个节点维护了一个链表,这个链表中,最久超时的排到后面。...另外 Node.js 还维护了一个 map,map 的 key 是相对超时时间,值就是对应的二叉堆节点。 堆的所有节点对应底层的一个超时节点。...Node.js 中多线程的架构如下图所示,每个子线程本质上是一个独立的事件循环,但是所有的线程会共享底层的 Libuv 线程池。 6.2 创建线程 接下来我们看看创建线程的过程。...当我们调用 new Worker 创建线程的时候 主线程会首先创建创建两个通信的数据结构,接着往对端发送一个加载 JS 文件的消息。 然后调用底层接口创建一个线程。...发起一个查找操作的时候,Node.js 会往线程池提及一个任务,然后就继续处理其他事情,同时,线程池的子线程会调用底层函数做 DNS 查询,查询结束后,子线程会把结果交给主线程

    2.3K30

    Node.js 内核的幕后英雄 --- 子线程

    前言:Node.js 为人所知的是单线程应用,也为人所知的是底层其实利用了多线程。...本文介绍 Node.js 中的这些幕后英雄。 1 Libuv 线程Node.js 中,Libuv 线程池是最为人所知的子线程。...从上面图中可以看到,这些任务是直接提交给线程池处理的,等线程池把任务处理后,再通知主线程执行回调。所以底层虽然是多线程的,但是 Node.js 中,所有上层的代码都是在单线程(主线程)中执行的。...Node.js 提供了 API 处理这种情况。 Node.js 底层正是通过 watchdog 实现了这种能力,下面来看一下具体实现,下面是核心代码。 if (timeout !...这是单线程导致的问题,所以 Node.js 中的调试功能是以独立的线程实现的。在 Node.js 中我们可以通过很多种方式打开调试功能。

    1.5K11

    深入理解 Node.js 中的 Worker 线程

    作为对此问题的解决方案,Node.js v10.5.0 通过 worker_threads 模块引入了实验性的 “worker 线程” 概念,并从 Node.js v12 LTS 起成为一个稳定功能。...本文将解释其如何工作,以及如何使用 Worker 线程获得最佳性能。 Node.js 中 CPU 密集型应用的历史 在 worker 线程之前,Node.js 中有多种方式执行 CPU 密集型应用。...JavaScript 语言没有多线程特性。因此,Node.js 的 Worker 线程以一种异于许多其它高级语言传统多线程的方式行事。...充分利用 worker 线程 现在我们理解 Node.js 的 worker 线程是如何工作的了,这的确能帮助我们在使用 Worker 线程时获得最佳性能。...为了克服第 1 点的问题,我们需要实现“worker 线程池”。 worker 线程Node.js 的 worker 线程池是一组正在运行且能够被后续任务利用的 worker 线程

    2K10
    领券