Node.js原理


一、V8引擎

1. 什么是V8引擎

1)一款专门对JavaScript语言进行解释和执行的流程虚拟机。
2)比如把V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;那么如果把V8引擎嵌入到NodeJS环境下,那么我们写的JavaScript代码就会被服务器所执行。
3)V8引擎嵌入到不同的宿主环境中时,可以把JavaScript语言应用到不同的多领域中。

2. 起初的作用

用于Chrome浏览器解析js脚本。

3. Node的诞生

Ryan Dahl(瑞安·达尔)修改V8引擎的内核, 把它用在了服务器开发, 经过修改后的这样一套东西就被称为Node.js


二、Node能够解决什么问题?

1)Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具
2)对比Java和Php的实现方式,Web服务器的瓶颈在于并发的用户量
3)Node在处理高并发 ( 指在同一时间并发访问服务器 ),I/O密集 ( 文件操作、网络操作、数据库 ) 场景有明显的性能优势, 与I/O密集相对的是CPU密集,CPU密集指的是逻辑处理运算、压缩、解压、加密、解密
4)Web主要场景就是接收客户端的请求,读取静态资源和渲染界面,所以Node非常适合Web应用的开发


三、Node.js简介

1. 什么是Node.js

1)Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime)
3)Node不是一门语言,而是一个开发工具,让JS运行在后端
4)Node不包含JavaScript全集,在服务器端没有DOM和BOM
5)Node也提供了一系列新的模块,例如:http,fs模块等
6)Node之前, js代码只能运行在客户端
7)Node之后, js代码可以和操作系统(Mac OS, windows, Linux…)交互, 战场从浏览器延伸到了服务器
8)Node.js 使用了事件驱动、非阻塞式 I/O 的模型,使其轻量又高效;并且Node.js 的包管理器 npm,是全球最大的开源库生态系统

2. 进程与线程

1)进程是操作系统分配资源和调度任务的基本单位,线程是建立在进程上的一次程序运行单位,一个进程上可以有多个线程。
2)浏览器是多线程的,我们更关注的是浏览器的渲染引擎。
3)渲染引擎内部是多线程的,内部包含两个最为重要的线程ui线程和js线程,ui线程和js线程是互斥的,因为JS运行结果会影响到ui线程的结果,ui更新会被保存在队列中等到js线程空闲时立即被执行。
4)JS是单线程的,JS在最初设计时就设计成了单线程,因为当时是用于UI绘制,多个线程同时操作DOM会很混乱。这里所说的单线程指的是主线程是单线程的,所以在Node中主线程依旧是单线程的。单线程特点是节约了内存,并且不需要再切换执行上下文,不需要管锁的问题。

3. 事件循环运行原理

1)所有同步任务都在主线程上执行,形成一个执行栈。
2)主线程之外,还存在一个任务队列;只要异步任务有了运行结果,就在任务队列之中放置一个事件。
3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,将队列中的事件放到执行栈中依次执行。
4)主线程从任务队列中读取事件,这个过程是循环不断的。

4. Node运行过程

在这里插入图片描述
1)我们写的js代码会交给v8引擎进行处理。
2)代码中可能会调用nodeApi,node会交给libuv库处理
3)libuv实现了异步io
4)通过事件驱动的方式,将结果放到事件队列中,最终交给我们的应用

5. Node.js特点

1)单线程,非阻塞I/O,事件驱动
2)单线程: 减少了内存开销(操作系统完全不再有线程创建、销毁的时间开销)
3)非阻塞I/O: 当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率; Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率,当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理, 阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行运行操作,这个线程的CPU核心利用率永远是100%
4)事件驱动: 不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度,在Node中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在一个时刻,只能执行一个事件回调函数, 但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。
5)Node.js当中所有的I/O都是异步的, 都是回调函数套回调函数。

6. 应用场景

1)因为Node.js最擅长的就是任务调度,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发;。
2)当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也非常适合与web socket配合,开发长连接的实时交互应用程序。
3)企业中的应用
企业中的应用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值