关于Nodejs 技术架构 如何与C++通信

 

关于Nodejs

版本:Nodejs单数是非稳定版本,双数是稳定版本

Nodejs是什么

先谈谈Nodejs不是什么

  • 不是Web框架,Nodejs并不是web后端框架,所以不能和Spring或flask对比
  • 不是编程语言,所以不能和Python和php对比

Nodejs是一个平台

  • 将多种技术组合起来
  • 让JavaScript也能调用系统接口、开发后端应用

Nodejs用了哪些技术

  • V8
  • libuv
  • C/C++实现的c-areas、http-parser、OpenSSL、zlib

Nodejs技术架构

- Nodejs Api 如http模块、fs、stream模块等
    - Nodejs bindings(让js和 C/C++通信)
        - V8 js引擎
        - libuv 跨平台的异步IO能力
        - DNS解析 c-areas
        - 加解密 OpenSSL 
        - 其他 http_parser、zlib等
    - C/C++ 插件(自定义其他能力,你可以自己写C/C++插件)

Nodejs与C++通信

Nodejs bindings
Nodejs bindings能将cpp文件编译成node文件,js require可以调用require文件
编译成node文件不是必须的,也可以是其他任何可行方式
如对http-parser的封装就是http_parser_bindings.cpp

libuv

背景
每个系统的异步io都不一样
Linux有epoll
windows有IOCP
Ryan为了实现一个跨平台的异步IO库,开始写libuv

libuv会根据系统自动选择合适的方案

功能
可以用于TCP/UDP/DNS/文件等异步操作

IO即输入和输出,所有系统和外界的交互行为都叫做IO操作

v8

功能

  • 编译js文件
  • 维护函数调用栈
  • 内存管理,为对象分配内存
  • 垃圾回收
  • 实现js的标准库

注意

  • V8不提供DOM API
  • V8执行js是单线程的
  • 可以开启两个线程分别执行js, 但V8本身是包含多个线程的,比如垃圾回收是单独的线程,只不过js执行是单线程的
  • 自带EventLoop但是Nodejs基于libuv自己做了一个

EventLoop

->1. timers
->2. I/O callbacks
->3. idle,prepare
->4. poll
->5. check 
->6. close callbacks
->1. timers

大部分时间停留在poll阶段
check主要用于检查setImmediate回调
timers主要检查setTimeout回调

所以setTimeout(cb,0)和setImmediate(cb)谁先执行?
一般般来说是第二个先执行,因为一般在poll阶段,从poll出来的时候,先到check,再到timers
但是也有例外,如果是第一次,那么先检查timers, 也就是第一个先执行

Nodejs技术架构总结

  • libuv支持异步I/0操作
  • 用EventLoop管理事件处理顺序
  • 用C/C++库高效处理DNS/HTTP
  • 用bindings沟通js和C++
  • 用V8运行js
posted @   IslandZzzz  阅读(578)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示