Nodejs的运行原理-调用篇详解编程语言

前言

之前做过Nodejs的架构篇, 有很多朋友留言给我,说没看懂里面的例子,这里我会重新梳理一下,再以http server为例,来解析Nodejs从前端到libuv的调用过程。

正文

 Nodejs的运行原理-调用篇详解编程语言

回忆a. Nodejs提供了许多功能接口(又称标准库),例如:http,net,socket etc

回忆b. 这些库是由C/C++写成,并且对外提供服务

回忆c. libuv负责异步调用工作(event loop)

Nodejs的运行原理-调用篇详解编程语言

这是上一篇我们使用过得流程图,从V8角度出发,描述了建立http server,js 到C/C++的过程,同时也包括了调用后端的参与者(tcpwrap,libuv)。图中1,2,3,4,5这些步骤是一个同步调用的过程,始于server.listen(),终于第5步,也就是server.listen()之后。

server.listen()发起的请求不一定会被处理完,V8会继续执行js代码。

当server.listen()发起的请求被处理完之后,libuv发起一个逆向的callback,始于libuv中的event loop,终于server中设置的callback函数,而这期间,V8可能已经完成了多条任务(小心回调地狱),这就是异步的优势所在。

PS:高并发不等同于高效率,我们以Nodejs的食堂为例,窗口阿姨调度得当,他很快地将饭菜分给学生,这不代表学生能够马上吃到饭,因为学生要慢慢地找到空闲的位置才能开始吃饭。(这里稍微吐槽下,Nodejs的运算速度比PHP5还要慢,不适合做逻辑复杂的项目)

一个简单的http server 例子:

var http=require("http"); 
http.createServer(function(req,res){  
res.writeHead(200,{ "content-type":"text/plain" });  
res.write("hello nodejs");  
res.end();  
}).listen(3000);

几行代码便可跑起一个http server,看似简单,背后肯定发生了很多故事。

我们来看下图,从createServer开始分析。

Nodejs的运行原理-调用篇详解编程语言

从上至下可分为两部分:

第一部分=创建一个server实例,这部分还是集中在js部分,其中http.js,http_server.js以及net.js为Nodejs库中的代码,这部分比较重要的细节是net.js,集成了若干API,这些API会为之后提供服务。

第二部分=从调用this.listen()开始,可以清楚地看到,第二部分直接调用net.js提供的api。createTCP()通过 process.binding(‘tcp_wrap’).TCP 进入到Nodejs C/C++部分,也就是图2 TCPWrap部分。在回来net.js的倒数第二步,handle.open(fd),这部分代码最终调用到C/C++部分的TCPWrap::Open()。

看完了这篇文章,是不是更清晰地了解Nodejs的运行原理了!

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/11741.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论