深入浅出Nodejs 3 异步I/O

1. 异步I/O

同步时间消耗: M+N

异步时间消耗: MAX(M, N)

耗时比较: CPU<内存<硬盘<网络

I/O: 磁盘文件, 硬件/内存, 套接字/网络

所以: node的异步, 可以高效的优化I/O方面的应用; CPU的耗时是最小的, 如果遇到高CPU计算的应用, 直接通过node实现是不擅长的, 可以考虑CPU率方向解决问题.

单线程同步编程模型: 堵塞I/O问题

多线程编程模型: 死锁, 状态同步, 上下文切换问题

阻塞I/O与非阻塞I/O区别

阻塞I/O: 完成了数据的获取过程, 这个过程, 用户进程只能等待结果返回.

非阻塞I/O: 不带数据返回, 获取数据需要文件句柄/文件描述符轮询读取.

node的的单线程, 仅仅只是js代码执行在单线程中, I/O任务是线程池处理的.

2. node的异步I/O

nodejs.png

在node中, 除了js是单线程外, node自身时期是多线程的, 只是I/O线程使用的CPU较少.

3. node, 非I/O的异步API

setTimeout(), setInterval(), setImmediate(), process.nextTick()

setTimeout(), setInterval() 区别是setInterval是多次执行 nodejs.png

setImmediate(), process.nextTick() 区别是优先级

setImmediate() 属于idle观察者

process.nextTick() 属于check观察者

优先级:

idle观察者>I/O观察者>check观察者

4. 事件驱动与高性能服务器

服务器模型

同步式: 一次只处理一个请求

每进程/每请求: 一个请求启动一个进程, php采用(不确定).

每线程/每请求: 一个请求启动一个线程, apache采用.

版本控制

Version Action Time
1.0 Init 2019-08-20