基础概念和知识
1. Node.js
Node.js是js的运行时runtime,直译过来就是运行时组件,底层使用c++实现,语法遵循ECMAScript规范,如果作者开发一个ruby、python的运行时,也可以叫Node.rb,Node.py
2. runtime和vm
- 最出名的是VC++用来开发window程序 如MFC
- vm是认为是硬件和二进制文件的中间层
- c++编译好的二进制文件可以直接被操作系统调用,java编写好的字节码文件交给虚拟机运行
3.Node的内部机制
前提要点:
-
在任务完成之前,cpu在任何情况下都不会暂停和停止执行,cpu如何执行和 同步、异步、阻塞。非阻塞都没有必然的联系
-
操作系统始终保证cpu处在运行状态。是通过系统调度来实现的。具体一点就在不同的进程和线程之间切换实现的
回调
将一个函数作为另一个函数的参数,并且该参数可以被执行,本质上是一个高阶函数
高阶函数必须满足的条件:
- 接受一个函数或者多个函数作为输入
- 输出一个函数
如map函数
[1,2,3,4].map(function(item){
console.log(item)
})
如下图描述回调的过程
主程序 回调函数
| |
| |
-->--底层调用-->->->->->->->->->--
回调函数和主程序处同一个层级上,假设主线程发起了一个底层的系统调用,那么操作系统转而去执行这个系统调用,当调用结束后,又回到主程序调用其他的方法,这就成为回调的原因
异步过程的回调
比如在node中,io操作时,代码会在发起一个调用后继续向下执行,io操作完成后再执行相应的回调函数(异步)虽然代码运行在单线程环境下,但是依靠异步+回调的方式也能实现对高并发的支持
同步和异步
- 同步和异步描述的是进程或线程的调用方式
- 浏览器提供的支持让js看起来像是一个异步语言
阻塞和非阻塞
- 阻塞和非阻塞是针对IO状态而言的,关注程序在等待IO调用返回这段时间的状态
- 上面两个概念没有任何联系。 阻塞!=同步,非阻塞!=异步
- IO操作概念:
node中IO特值Node程序在Libuv支持下与系统磁盘和网络交互的过程 - 四个常用IO编程模型:
-阻塞IO -非阻塞IO -事件驱动IO -异步IO ,Node官网显示自己是 非阻塞IO,原因是异步IO是靠Libuv模拟出来的
单线程和多线程
-
java等语言中有多线程特性,开发时我们可以自己定义多个线程来协同工作,这个时候,我们的代码就是运行在多线程环境下
-
Node没有提供多线程的支持,但是可以派生多个进程来达到完成工作的目的,另一方面,Node的底层不是单线程,Libuv会通过类似
线程池的实现来模拟操作系统下的异步调用,对于我们开发者是不可见的(Libuv是一个跨平台的异步IO库)
并行和并发
- 排队买票时,两队开头的人交替上前到一个窗口取票,这是
并发 - 排队买票时,两队的人同时上前到两个各自的窗口取票,这是
并行,速度是一个窗口的两倍以上,这就避免了一个窗口在两队人之间的队列切换 并发是希望计算机做更多的事情,处理更多的队列,并行是希望计算机能够快速完成任务 - Node中的单线程支持高并发,通常是依靠异步和事件驱动(循环)来实现的,异步使得代码在面临多个请求时不会发生阻塞,事件循环提供了IO调用结束后调用回调函数的能力
4.事件循环-Event Loop (更新中)
最近在阅读
李锴著作的《新时期的Node.js入门》一书,所以将自己在学习中的点点滴滴一一整理了出来,希望日后能够慢慢回顾这些知识点,此书挺不错的,笔者还在学习中,入门的同学可以入手一本。挺听书名就知道了(#^.^#),持续学习更新中...