Nodejs的运行原理-生态篇

小说:淘宝一天刷20单安全吗作者:辛北顺更新时间:2018-09-22字数:41325

“你现在能接住子弹吗?不要说和火云邪神那样将手枪指着脑袋距离脑袋只有一公分左右的距离那么近,远一点几米开外能不能做到空手接子弹。”布玛突然开口问道。

苹果手机appstore注册

阿傩将金盘递给仙女,双手合十给居上座的王母玉帝施礼,然后道:“佛家七宝乃是金、银、琉璃、玻璃、砗磲、赤珠、玛瑙。得三宝则国泰,得七宝则民安,乃是取个吉祥之意。”
唐僧方要谢恩,只听黄门官报曰:“揭皇榜的名医到了!”国王听来了名医,也不顾唐僧,扯着脖子向外面看,悟空自然也向外看,遥遥只见一人器宇轩昂走进了大殿,悟空一见这人,实在是惊喜交加,你道是谁,原来竟是二郎神杨戬!

“很公平,说吧,惩罚是什么。”看着乔伊那不怀好意的眼神刘皓能想象的出来乔伊绝对是在整他。

前言

这里是重点: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
", *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可以自由切换。如下图所示。

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

libuv

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

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

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

Nodejs

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

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

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

当 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来完成这些操作。

 

编辑:龙秉建

发布:2018-09-22 00:15:09

当前文章:http://www.leetaemin.cn/news/20180774745.html

秀米编辑器电脑版下载 单人直升机 可以日赚300的平台 找米斗 注册会计师cpa 网上翻译赚钱 国外冲浪赚钱网站 国外游戏排行榜2018

16449 69963 64376 81823 25892 3774035132 40716 35559

我要说两句: (0人参与)

发布