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

回忆a. Nodejs提供了许多功能接口(又称标准库),例如:http,net,socket etc
回忆b. 这些库是由C/C++写成,并且对外提供服务
回忆c. libuv负责异步调用工作(event loop)

这是上一篇我们使用过得流程图,从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开始分析。

从上至下可分为两部分:
第一部分=创建一个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的运行原理了!
Nodejs的运行原理-调用篇的更多相关文章
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- Nodejs的运行原理-架构篇
前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...
- Nodejs的运行原理-libuv篇
前言 这应该是Nodejs的运行原理的第7篇分享,这篇过后,短时间内不会再分享Nodejs的运行原理,会停更一段时间,PS:不是不更,而是会开挖新的坑,最近有在研究RPG Maker MV,区块链,云 ...
- Nodejs的运行原理-科普篇
前言 Nodejs目前处境稍显尴尬,很多语言都已经拥有异步非阻塞的能力.阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接收生成好的数据,然后或渲染后,或直接发送到 ...
- Nodejs的运行原理-生态篇
前言 这里是重点:Nodejs 是由v8 engine,libuv和内置模块组成,可以将v8 engine和 libuv看成一个库,两者是以源码的方式直接编译执行node中去的. 这是一个广泛的介绍, ...
- Nodejs的运行原理-模块篇
前言 使用Nodejs,就不可避免地引用第三方模块,它们有些是Nodejs自带的(例:http,net...),有些是发布在npm上的(例:mssql,elasticsearch...) 本篇章聚焦3 ...
- Nodejs的运行原理-函数回调篇
前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...
- 谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
- nginx如何调用PHP(nginx+php运行原理)
采用nginx+php作为webserver的架构模式,在现如今运用相当广泛.然而第一步需要实现的是如何让nginx正确的调用php.由于nginx调用php并不是如同调用一个静态文件那么直接简单,是 ...
随机推荐
- 关于 AspNet Core 的配置文件 与VS2017 安装
下面链接 是VS2017 安装EXE 我现在装过了就不去截图演示了,有哪位不理解的可以@我. 链接:https://pan.baidu.com/s/1hsjGuJq 密码:ug59 1.今天我给大家带 ...
- android代码混淆笔记
混淆处理的apk被反编译后代码中包名类名等都变成abcd之类.非常难看懂. 使用代码混淆.启用混淆器,对相关文件进行编辑,然后打包签名就能够了: ------------ 在2.3的版本号中,项目中有 ...
- OR1200中指令Cache的结构
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.o ...
- 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理
豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...
- springboot 热部署的两种方式
问题的提出: 在编写代码的时候,你会发现我们只是简单把打印信息改变了,就需要重新部署,如果是这样的编码方式,那么我们估计一天下来就真的是打几个Hello World就下班了.那么如何解决热部署的问题呢 ...
- 【CSS3】动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【Uva10559】Blocks(区间DP)
Description 题意:有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为区间长度的平方,然后左右两边连在一起,问最大分数为多少. \(1\leq N\leq200\) Sol ...
- echarts异步数据加载(在下拉框选择事件中异步更新数据)
接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...
- MYSQL忘记root密码后如何修改
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- INITTAB 配置文件
Inittab 文件详解 init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序. ...