单线程为什么能支持高并发?

  1. Nodejs是一个平台,构建在chrome的V8上(js语言解释器),采用事件驱动、非阻塞模型( c++库:libuv)

为什么单线程却能够支持高并发?

先搞清楚概念

单线程:主线程一个,底层工作线程多个。

异步:发出操作指令,然后就可以去做别的事情了(主线程不需要等待),所有操作完成后再执行回调

cpu核数与线程之间的关系

线程:又是被称为轻量级进程(Lightweight Process LWP),是程序执行的最小单元。每一个程序都至少有一个线程,若程序只有一个线程,那么就是程序本身。

单线程的进程可以简单的认为只有一个线程的进程。一个进程在同一时间只做一件事。

多线程的进程可以尽可能的利用系统CPU资源。但也不是线程越多越好,线程越好,CPU分配给每个线程的时间片就越少。具体到这个任务在CPU哪个核上运行,这个就跟操作系统和CPU本身的设计相关了

什么是cpu密集型操作

复杂的运算、图片的操作

// 这就是一个cpu密集型的操作
for (let i = 0; i < 100000000; i++) {
    console.log(i);
}

node在什么情况下会高并发

I/O密集型任务

怎么实现

事件机制的底层依赖库:libuv、libeio、libev

libuv

node的工作线程去执行的(nodejs底层的libuv是多线程的线程池用来并行io操作),且主线程是不需要等待结果返回的,只要发出指令马上就可以去忙其他事情了。  

开发node过程中需要跨平台,首选为Linux使用libev(底层为epoll),备选Windows使用IOCP实现,用于抽象libev和IOCP的高性能网络库。

epoll和IOCP的区别
  • epoll用于Linux系统,IOCP用于Windows系统
  • epoll是同步非阻塞模型:当事件资源满足时发出可处理通知消息(主线程需要自己去处理);IOCP是异步非阻塞模型,当事件完成时发出通知消息(工作线程帮主线程处理完了)。
    image
node运行机制

image

  1. V8引擎解析JavaScript脚本
  2. 解析后的代码,调用Node API
  3. libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎
  4. V8引擎再将结果返回给用户

虽然nodejs的I/O操作开启了多线程,但是所有线程都是基于node服务进程开启的,并不能充分利用cpu资源

单线程的优劣

好处
  1. 多线程占用内存高
  2. 多线程间切换使得CPU开销大
  3. 多线程由内存同步开销
  4. 编写单线程程序简单
  5. 线程安全
坏处
  1. CPU密集型任务占用CPU时间长
  2. 无法利用CPU的多核
  3. 单线程抛出异常使得程序停止

  目录