当前位置: 首页 > 后端技术 > Node.js

Node单线程——如何理解“单线程”-Node实现了多线程

时间:2023-04-03 10:37:20 Node.js

Node单线程理解Node是单线程的,也就是说JavaScript的执行是单线程的,但是Javascript的宿主环境,无论是节点或浏览器所有服务器都是多线程的。Node启动后,会创建一个v8的实例。这个实例是多线程的(你可以在活动监视器中看到多个线程)。比如node的线程的主线程:编译执行代码。编译/优化线程:可以在主线程执行时优化代码。Analyzer线程:记录被分析代码的运行时间,为Crankshaft优化代码执行提供依据。垃圾回收中的几个线程问题CPU利用率不足。一个未捕获的异常可能导致整个程序退出。解决方案:让node具备多线程的实力false:多进程方式模拟多线程集群(多进程模型)Cluster实现对child_process的封装,通过fork方式实现多进程模型。优秀代表:pm2true:实验模块worker_threads(Node10.5.0的发布,官方给出了真正的Multi-threading能力)Process进程和thread线程的区别Process:是资源的基本单位(CPU,内存,等)分配,它是程序执行的一个实例。程序运行时,系统会创建一个进程,为其分配资源,然后将进程放入进程就绪队列。当进程调度器选中它时,会为其分配CPU时间,程序开始运行线程:当程序执行时进程的最小单位是一个进程的执行流程,它是CPU的基本单位调度和调度。一个进程可以由多个线程组成,进程的所有资源在线程之间共享。线程由CPU独立调度执行,在多CPU环境下允许多个线程并发运行。同样,多线程也可以实现并发操作。每个请求都分配了一个线程来处理差异/优缺点。进程是资源分配的最小单位,线程是程序执行的最小单位。一个进程有自己独立的地址空间。每启动一个进程,系统都会为其分配一个地址空间,并创建一个数据表来维护代码段、堆栈段和数据段。此操作非常昂贵。线程共享进程中的数据,使用相同的地址空间,所以CPU切换线程的代价比进程小很多,创建线程的代价也比进程小很多。线程之间的通信更加方便。同一个进程下的线程共享全局变量、静态变量等数据,进程之间的通信需要通过通信(IPC)的方式进行。但是,如何处理同步和互斥是编写多线程程序的难点。但是多进程程序更健壮。多线程程序只要一个线程死掉,整个进程也死掉,而且一个进程死掉不会影响到另一个进程,因为进程有自己独立的地址空间。补充理解计算机的核心就是CPU,它承担着所有的计算任务。它就像一个工厂,一直在运行进程:CPU可以处理的单个任务。任何时候,CPU始终运行一个进程,其他进程处于非运行状态(当一个车间开始时,其他车间必须停止。其背后的含义是单个CPU一次只能运行一个任务)线程:(在一个车间里,可以有很多工人。他们合作完成一个任务)一个进程可以包括多个线程,一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。(每个房间的大小不一样,有的房间最多只能容纳一个人,比如厕所,里面有人的时候,其他人是进不去的。)当一个线程使用一些共享内存时,其他线程必须等待它在使用它之前结束。这块内存“互斥锁”:防止多个线程同时读写某个内存区域(防止其他人进入的简单方法是在门上加一把锁,先到的人锁住门,后来到的人看到锁了,就在门口排队,等锁打开再进去)有些内存区域只能被固定数量的线程使用。“信号量”)(Semaphore),用于保证多个线程不会相互冲突(有一些房间可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等就是在门口挂n把钥匙,进来的人拿一把钥匙,出来的时候把钥匙挂回去,后来到的人发现钥匙是空,所以他知道他必须在门口排队等候)运行系统设计(1)以多进程的形式,允许多个任务同时运行;(2)以多线程的形式,让单个任务分成不同的部分运行;(3)提供协调机制,一方面防止进程与线程之间的进程冲突,另一方面允许进程与线程之间共享资源