首页 技术 正文
技术 2022年11月21日
0 收藏 634 点赞 3,942 浏览 1924 个字

前言

Nodejs的运行原理-生态篇

这里是重点:Nodejs 是由v8 engine,libuv和内置模块组成,可以将v8 engine和 libuv看成一个库,两者是以源码的方式直接编译执行node中去的。

这是一个广泛的介绍,后面会详细介绍Nodejs的生态圈。

V8 engine

V8官方文档 https://developers.google.com/v8/intro

        #include "include/v8.h"
#include "include/libplatform/libplatform.h"using namespace v8;int main(int argc, char* argv[]) {
// V8初试化.
V8::InitializeICU();
Platform* platform = platform::CreateDefaultPlatform();
V8::InitializePlatform(platform);
V8::Initialize();// 创建isolate.
Isolate* isolate = Isolate::New();
{
Isolate::Scope isolate_scope(isolate);// 创建HandleScope.
HandleScope handle_scope(isolate);// 创建context 环境.
Local<Context> context = Context::New(isolate);// 引入环境.
Context::Scope context_scope(context);// 创建字符串.
Local<String> source = String::NewFromUtf8(isolate, "'Hello' + ', World!'");// 编译字符串.
Local<Script> script = Script::Compile(source);// Run,并且获取返回值.
Local<Value> result = script->Run();// 转换为utf8,并且打印出来.
String::Utf8Value utf8(result);
printf("%s\n", *utf8);
}// 关掉v8.
isolate->Dispose();
V8::Dispose();
V8::ShutdownPlatform();
delete platform;
return 0;
}

上面代码展示了一个典型的V8使用例。

1.isolate 代表一个V8实例,各个isolate是独立的(隔绝的),isolate中的obj无法再另一个isolate中被使用。

2.context 代表执行js代码的虚拟机,在这个虚拟机中,集成了一些功能,例如math,json,date(),RegExp()等。一个isolate可以同时存在多个context,这些context可以自由切换。如下图所示。

Nodejs的运行原理-生态篇

3.在V8 engine中,通过handle访问存在与heap上的js obj,如local,persistent,eternal,在V8中,有一个handle stack用于管理这些handles,如下图所示。

Nodejs的运行原理-生态篇

libuv

libuv主要用于处理事件驱动的异步IO模型,官方文档 http://nikhilm.github.io/uvbook/

Nodejs的运行原理-生态篇

libuv通过epoll,kqueue,event ports和IOCP来实现异步network IO。file,dns的操作则依赖于thread pool 来实现,正如上图所示。

libuv的重点是IO和event loop,loop负责调度callback,运行idle function,执行轮询等操作。

Nodejs的运行原理-生态篇

Nodejs

除了V8 engine和libuv ,Nodejs本身也做了很多的工作,它提供了js模块,c++模块等核心模块供开发者使用。

Nodejs 将这些核心js模块命名为native module,c++模块命名为builtin module,內建的c++模块则安放于node源码lib目录下。

下图为native module和builtin module编译及加载到内存的全过程。

Nodejs的运行原理-生态篇

当 node test.js 执行时,node_main.cc首先被调用,这一步初始化了V8 engine和libuv执行环境。

uv_run(env->event_loop,UV_RUN_ONCE)用于启动libuv event loop,而我们的js代码则会被传递到creatEnvironment(),最后交由V8处理。

查看Node.cc代码,可以看到一些函数与V8交互的工作,例如context,handle等的创建。

在js中,类似基于prototype继承的方式来实现的,通过V8提供的c++ API来完成这些操作。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,994
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,507
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,350
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,135
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,768
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,846