因为学习了一段时间的node.js了,发现如果对Node.js的原理不理解,很影响编程,所以便看了很多博客和书,包括大名鼎鼎的朴灵的《node.js深入浅出》还有《计算机操作系统》让我对node.js的原理有了更好的理解,把我的一些理解记录一下,也希望对正在学习node.js的道友有所帮助
为什么需要异步呢? 因为现在的庞大的人群已经不是简单的服务器可以轻松胜任了,我们需要提高资源利用率。如果是同步的话,当我们有两个程序之间存在前趋关系时,也就是说第二个资源对第一个资源有所依赖时,那么耗时就是两个时间之和,但我们如果使用异步,这两个资源并不存在前趋关系,第二个资源并不受第一个资源是否完成的影响,那么我们就可以享受并发的优势。极大的提高了资源利用率。
下面来说下非阻塞I/O ,非阻塞I/O和异步并不一样,解释下就是非阻塞是我的进程不会被挂起,这叫非阻塞,而异步就是在意的如何得到返回结果,举个例子,我们去买饭,大姨我要个鸡腿饭,如果是同步的话,那我们就一直在那等着,如果是异步,那我们会说,我先去坐着好了叫我,那这样看来买饭并不能耽误我对其他事情的请求,也就是我还可以做其他事,等待大姨叫我拿饭就可以了。。所以两者我倒觉得不能说以一种东西,他们所关注的地方不一样,或许只能说既然异步那肯定不存在阻塞。。
我们通过上面已经可以理解异步I/O道理是怎么回事了。那我们会想计算机中是如何实现这样的异步I/O,因为上面我们说了一个例子,也就是我们去买饭,只需要等待大姨的回复就好,不需要我们主动的去问,那计算机如何判断是否有回应呢?那边是事件轮询,计算机需要一直判断这个事件是否完全获取数据。在我使用的window下的异步调用模型IOCP和node.js的异步调用模型十分相似。内部原理采用的线程池模拟异步I/O策略。
node.js如何实现异步I/O呢?
首先我们要知道node.js本身的执行模式是-事件循环,所以回调函数在node.js应用广泛。每一次循环过程我们成为tick,每一次tick我们查看是否有事件待处理。回调函数就会在这时取出执行。而我们如何判断每个tick是否有事件还需要执行呢,这时候就需要引入观察者,通过观察者询问我们就可以知道是否有事件要执行。