Node简介

1. node是什么?

  node是一个基于V8引擎的js运行环境,其特点为:

  (1)异步I/O:用户线程在操作I/O时根本不考虑IO的执行,全部交给IO线程池去处理,用户线程只用等待一个完成信号即可—从语言层面上可以很自然进行并行I/O操作,每个调用之间都无需等待之前的IO调用结束。

  eg:以读文件为例:

 *  同步IO方式:耗时M+N;

     * fs.readFileSync('1.text'); //耗时M

     * fs.readFileSync('1.text'); //耗时N

* 异步IO方式:耗时max(M, N);

      * fs.readFile('1.text', function(){ ... }); //耗时M

      * fs.readFile('2.text', function(){ ... }); //耗时N

异步IO调用示意图

  (2)事件与回调函数:

       * 将事件从前端浏览器引入后端,配合异步IO,将事件点暴露给业务逻辑;

       * 回调函数作为最好的接收异步调用返回数据的方式;


Node服务器绑定了一个request事件,对于请求对象,为其绑定data事件和end事件

  (3)单线程:Node自身是多线程的,而js线程与其余线程是无法共享任何状态的,而且js代码无法并行执行(同一时间段只能执行一段代码);

 * 优点:

      * 不存在多线程中死锁、状态同步等问题;

      * 不存在创建线程和执行期上下文切换的开销;

* 缺点:

      * 无法利用多核CPU;

      * 错误会引起整个应用退出,健壮性不高;

      * 大量计算占用CPU导致cpu时间片不能释放 — 后续的异步IO发不出调用,已完成的异步IO回调函数得不到执行;

* 解决长时间计算:

      * 编写c/c++扩展(后续文章会介绍)的方式更高效利用CPU;

      * 通过子进程的方式,讲一部分node进程当作常驻服务进程用于计算,然后利用进程间的消息来传递结果,将计算和IO分离,充分利用多CPU;

(4)跨平台:基于libuv实现;

libuv已成为许多系统实现跨平台的基础组件

2. node的构成

nodejs架构

(1)V8:以C++实现的高性能的js引擎;

    * 将编写的js代码编译成机器码,然后再执行;

    * 提供c++函数接口,为nodejs提供v8初始化,创建context、scope等;

(2)libuv:为builtin modules提供了API,这些API用来支持请求和数据返回的异步处理方式(回调函数在libuv触发);

libuv的架构
libuv细节流程图

(3)builtin modules:由c++写的各类模块,包含file stream、crypto、zlib等基础功能;

(4)native modules:js写成供应用程序调用的库,依赖于builtin modules来获取相应的服务支持;

    综上:暴露给开发者的接口是native modules,当我们发起请求,请求自上而下穿越native modules,通过builtin modules将请求传送至v8、libuv和其他辅助服务,请求结束则从下回到上层,最终调用我们的回调函数。

3. 模块分类

(1)文本模块

    * js文本模块:自己编写并保存的.js文件;

    * JSON模块:JSON文件;

    * c/c++扩展:使用node-gyp扩展构建工具将扩展文件编译为.node文件(windows下是.dll 文件,*nix下是.so文件,libuv屏蔽了平台的差异,在node中统一为.node文件) 进入node命名空间中,通过process.dlopen()加载代码执行;

(2)核心模块

    * js核心模块:node项目的lib目录下,Node项目编译时先会将lib目录下的js文件编译成c/c++文件—以字符串的形式进入二进制文件(存在于node命名空间中),在调用js核心模块时通过process.binding('Natives')加载并编译执行—获取js核心模块的源代码字符串,再将其转为函数编译并执行,将其结果缓存在 NativeModule._cache对象上;

    注:两个过程的编译不一样:第一个编译过程只是将js源代码转为字符串后注册进c里的数组中,然后生成.h文件进入node环境中;第二次编译是将js源代码编译成可执行的二进制文件;

    * c/c++核心模块:内建模块,node项目的src目录下,也是通过.h头文件将模块添加到node_module_list数组中,将src目录的内建模块名写入node-gyp的‘target_name’的'node'节点的source中,在编译整个Node项目的时候,将其代码编译为可执行文件,在调用时通过process.binding(内建模块名)  协助加载内建模块编译后的代码,直接执行即可;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容