Node.js概述
-
Node.js是基于Chrome V8引擎的JavaScript运行时环境
-
Node.js的每个函数都是同步的,而I/O操作都是异步的(非阻塞I/O特性)。结合libuv扩展了JavaScript功能,使得JavaScript能够支持浏览器DOM操作,同时具有后端语言才有的I/O、文件读写与操作数据库等能力。其中I/O操作由libuv提供的事件循环处理,将非阻塞I/O的处理细节隐藏。
-
Node.js使用npm作为包管理,npm是开源库里最大的包管理生态
Nodejs架构模式
Node.js有两类线程,①主线程:事件循环Even loop ②几个辅助线程:在工程线程池中k个工作线程。
Node.js是基于Chrome V8引擎构建的,由事件循环分发I/O任务,工作线程会将任务放在工作线程池中执行,事件循环会去监听文件描述符,当文件描述符发生变化,事件循环线程会把文件描述符转换成合适的事件,然后触发与该事件对应的回调函数。
工作线程池使用一个真实的队列,里边装的都是要被处理的任务。 一个工作线程从这个队列中取出一个任务,开始处理它。当完成之后这个工作线程向事件循环线程中发出一个“至少有一个任务完成了”的消息。
Node.js Bindings层做的事就是将Chrome V8引擎暴露的C/C++接口转换成JavaScript API,并且结合这些API(Nodejs SDK)编写Node.js标准库。在许多Node.js应用程序中,API是工作线程池任务的唯一来源。必须说明,当在事件循环线程的一个回调中调用JavaScript API 时,事件循环线程必须要进入对应 API 与 C++ 桥接通讯的 Node.js C++ binding 中,从而向工作线程池提交一个任务。 当然和整个任务的成本相比,它的开销是微不足道的。
异步I/O处理图示