Node&JS原理

本文探讨了服务器端I/O的两种主要形式:网络I/O和文件I/O,并对比了Windows、Linux下的异步I/O模型。深入解析了线程池、消息队列在异步处理中的应用,以及在Node.js中执行栈、回调函数和上下文环境的工作原理。

执行&异步

服务器端的I/O主要有两种情况:一是来自网络的I/O;二是对文件(设备)的I/O。Windows的异步I/O模型能很好的适用于这两种情况。而Linux针对前者提供了epoll模型,针对后者提供了AIO模型
线程池中的工作线程的数量与CPU内核数量相同,以此来最小化线程切换代价

消息队列
libuv
V8执行栈
代码执行
...执行fn1定义
调用fn1,调用console.log,调用createServer,调用方法时先为其创建上下文
上下文入栈
执行createServer方法
执行回调
发起http/fs异步调用请求,传递回调函数和执行上下文
新请求或异步操作完成,封装cb和result放入消息队列
消息中的callback和result入栈
执行完毕
若栈空,检查消息队列
没有监听器且队列为空
消息对象
IOCP on Win
epoll on *nix
线程池
createServer上下文环境
fn1上下文环境
全局上下文环境
当前上下文中代码执行,变量赋值
(_,res)=>res.end('hi')上下文环境,闭包
全局上下文环境
var http = require('http')
function startServer() {
console.log('starting')
http.createServer((_,res)=>res.end('hi')).listen(8000)
console.log('started')
}
startServer()
创建全局上下文并入栈,然后执行全局代码
定义函数时会为其创建一个指向其定义时所在环境的scope属性
确定arguments(实参),函数声明(提升)-变量声明(提升)-作用域链scope-确定this
弹出栈
程序退出

这就解释了为什么那些回调函数的this指向window,因为这些异步的代码都是在全局上下文环境下执行的,但回调函数是个闭包,它保存了原来作用域的信息

本数据集来源于 2024 年 7 月在江西省中东部余干县、贵溪市、金溪县丘陵林地采集的千枚岩、红砂岩、花岗岩母质发育红壤关键带剖面土壤实测数据,空间覆盖 3 个县域不同岩性风化壳林地,采样点位经纬度分别为千枚岩剖面 P10(116.8316°E,28.5269°N)、红砂岩剖面 P08(117.1048°E,28.3492°N)、花岗岩剖面 P04(116.6883°E,27.9963°N);垂直空间采样深度存在差异,千枚岩与花岗岩剖面采样深度 0~600 cm,红砂岩剖面采样深度 0~450 cm,垂直分层采样分辨率为 0~50 cm 区间分 0~20 cm、20~50 cm 两层,50 cm 以下土层以 50 cm 为固定间隔分层,整套数据集共包含 36 条土壤剖面分层记录,其中 P10 千枚岩剖面 13 条、P08 红砂岩剖面 11 条、P04 花岗岩剖面 13 条。数据采集时间为 2024 年 7 月,实验室理化指标、矿物测试、酸碱滴定及统计建模工作于 2024 年 7 月 —2026 年 5 月完成,无时间序列连续监测数据,仅为单次野外剖面采样静态数据集。 数据集包含野外剖面基础信息、土壤酸碱滴定原始数据、土壤酸度指标、交换性盐基与交换性酸、土壤机械组成、有机质、黏土与原生矿物半定量 XRD 数据、无定形 / 晶形铁铝氧化物含量。全量理化指标计量单位统一规范:酸缓冲容量 pHBC 单位为 cmol・kg⁻¹・pH⁻¹,交换性酸、交换性盐基离子单位为 cmol・kg⁻¹,矿物以质量百分比(%)表示,、黏粒 / 粉粒 / 砂粒、有机质、铁铝氧化物单位均为g/kg,pH 为无量纲数值。 覆盖范围: 中位纬度: 28.2616 中位经度: 116.89654999999999 南界纬度: 27.9963 西界经度: 116.6883 北界纬度: 28.5269 东界经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值