理一理NodeJS的一些基础概念
NodeJS是一个单线程运行的,非阻塞I/O。Node不是语言,不是框架,只是基于V8运行时环境。用Chrome V8 解释并执行 JavaScript 代码。
NodeJS是用libuvku的库来实现,libuvku跨平台 运行在windows linux上
JS运行的chrome环境是V8引擎,而Webkit 浏览器对应的是渲染引擎。
事件轮询:
event loop(三个非阻塞网络调用:一个用于请求,一个用于数据库,一个用于响应)
libuv
由事件循环和线程池组成,负责所有 I/O 任务的分发与执行。
高并行与高并发的概念:
高并发:两个队伍买火车票,一个窗口。(希望计算机做更多事情)。
高并行:两个队伍买火车票,两个窗口,加快速度。(希望计算机更快地完成任务)
Node的代码虽然运行在单线程中,但仍然支持高并发,就是依靠事件循环实现的。
如果存在并行,一定是存在在libuv的线程池中的。
JavaScript的事件循环是依靠浏览器实现的,而Node作为另一种运行时,事件循环由底层的libuv实现。
这里重点讲两个方法:
process.nextTick会在当前操作完成后立刻执行,因此总会在setImmediate之前执行。
setImmediate方法不属于ESMAScript标准,而是Node提出的新方法。setImmediate的事件会在poll阶段结束后执行。
区分容易混淆的两对概念:同步/异步 阻塞/非阻塞
同步:进程/线程发起调用后,一直等待调用返回后才继续执行下一步操作。但CPU不会等待,多半会切换到另一个进程/线程上去。
异步:发起调用后,进程/线程继续向下执行,当调用返回后,通过某种手段来通知调用者。
阻塞与非阻塞:针对IO状态而言的。与同步/异步没有任何必然联系。除了AIO外,阻塞和非阻塞IO都是同步的。