node.js的原理概述

nodejs的诞生

创始人Ryan Dahl,他为了解决服务器的高并发性能问题,他认为通过事件驱动和异步I/O来解决这个问题是关键。
然后2008年谷歌推出了chrome浏览器,使用V8引擎就满足了他的想象。v8引擎的优势
1、历史遗留问题少,都是异步I/O
​2、强大的编译和执行的效率
​3、javascript的闭包特性非常方便
​4、利用事件驱动机制
随后Ryan Dahl就发现了v8引擎的巨大优势,然后Ryan Dahl就把v8移植到了服务端,就这样nodejs就从他的手中脱颖而出,就这样诞生了。

nodejs的简介:

1、构建在chrome浏览器v8引擎上的一个运行环境
2、非阻塞I/O模型
3、事件驱动
4、以最少的硬件成本,追求更高的并发,更高的处理性能

nodejs的运行原理:

先来看看nodejs的底层架构图:
在这里插入图片描述
nodejs内部总共分为三层:应用层(js)、桥(c/c++)、底层库(c/c++):
应用层:就是我们的一个标准库,这一层是使用js写的,这里面提供了我们能直接进行调用并使用的一些api,比如:fs、steam、http等等,
:Node bindings这一层的作用就是,让我们应用层能够调取node底层的c/c++这一层,充当一个桥的作用。
底层库:底层库使用c/c++编写的,大致工作流程就是,nodejs会通过Node bindings将我们的js传给底层库的v8进行解析,然后通过libuv这个库进行循环调度最后再返回给我们的上层,nodejs它的高效的异步编程,很大程度上就是依靠我们这个libuv,因为libuv为nodejs提供了很多的池,比如说:线程池、事件池、异步I/O等等。也为nodejs提供了很多其他模块。比如C-ares,提供异步DNS解析等等。

nodejs单线程:

用很简洁的话来说:nodejs本质上还是一个单线程,但是内部的非阻塞I/O、事件驱动、线程池等操作会把nodejs的运作从宏观上当成是一个并行。我们来看一张图:
在这里插入图片描述
这张图就是我们nodejs进行一个单线程操作时,他的业务处理和I/O操作时的高效性,为什么高效呢?从图中可以看出,当我们开始业务1的计算1的时候,cpu遇到I/O,就会马上处理业务2的计算1,等I/O结束之后就会又马上处理业务1的计算2,通过回调的方式,反复执行,从这就可以看出,cpu的利用率就达到了100%,而且node因为是单线程,还没有创建线程、销毁的事件开销,这就体现了nodejs的高效性。

非阻塞I/O机制:

在这里插入图片描述
一句话,就是很多人干活,可能有些人是闲着的,还不如一个人玩命,死里干活, 这就是这个非阻塞I/O的原理

事件循环与实践驱动:

我们先看一张图,这张图就是nodejs事件处理的时候,进行事件循环的流程:
在这里插入图片描述
我们这里通过两种方式来讲解这个图
用户通过网络请求过来的时候:
node会把他放在一个维护的事件队列(Event Querue)中,这时候node内部不会去立马执行它,而是继续往队列下面走,直到主线程执行完过后,再通过循环机制(Event loop)进行一个判断,如果判断是非I/O的任务,就会亲自执行并通过回调函数(Callback)返回到上层(Response)进行调用。
用户通过I/O请求过来的时候:
开始和上面一样,到loop这里的时候就会进行一个判断,如果是I/O任务,就会使用libuv这个库的线程池,分配一个线程出来,来处理这个事件,然后通过Callback将处理的这个事件放在我们的这个事件队列的尾部,当事件队列轮询到这个事件的时候,就会亲自处理,并通过回调函数,返回给我们的上层(Response)
这就是这个事件循环的机制
之所以能处理高并发的原因:
在这里插入图片描述

nodejs的优缺点:

优点:
I/O密集型的处理时node的强项,因为node处理I/O请求都是异步的,比如(sql查询请求、文件操作流、http请求等等)
缺点:
不擅长cpu密集处理型,比如:

for(let i=0; i<10000000; i++){
	console.log(i)
}

毕竟node还是单线程了,如果这种耗时比较长的计算量比较大的处理的话,会阻塞我们的程序运行,就会容易造成卡顿。

总结:第一次写了好久的文章,可能会有写的不好的地方,以上是对nodejs的一些原理的一些概述,谢谢大家~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值