事件轮询&异步IO

事件轮询是一种任务处理的方式。在系统底层维护这个一个事件队列,这个队列中不断的有未完成的任务进来,也不断的有完成的任务出去。

异步IO是一种资源获取的方式。堵塞式IO会一直读取这个文件,直到读完后返回这个文件的内容。异步IO会注册一个未完成事件,同时分配一个读文件的任务给CPU,CPU会合理安排自己的时间默默完成任务,然后告诉系统,我已经读完了,内容给你存到file变量里了。

如果你熟悉前端开发,就能很自然的接受这种处理方式。因为点击一个按钮就会触发一个事件处理函数,来完成对应的逻辑。而这段逻辑是事先写好的,只是没有运行等在那里被触发、被完成。

至于为什么node需要事件轮询这种机制,因为一个node服务是跑在一个单线程上的。

单线程对于高级Java程序员来说就是低效缓慢的代名词。对于Java来说,想要提供更大量的服务的方式就是不断的开启新的线程,每个线程去处理一个任务,这个时候处于内存中的数据是共享的,我们可以切换上下文来获取和交换不同线程中的数据。这种横向扩展的代价非常大,会大量消耗内存,频繁的上下文切换也会消耗CPU的运算能力。而node这种单线程就不会随着服务的扩展过分消耗内存,配合异步IO,能极大的发挥出CPU高速运算的能力。

单线程的设定决定了,node要通过事件轮询的机制来处理事件,而事件轮询也决定了数据处理要是异步IO的。这三点都是环环相扣的。

如果说编程就是演奏一首曲子,我们可以把这首曲子从两个领域分解,一个是时间域,一个是频域。对于时间域,这首曲子在不同的时间点的音调都会随着时间变化,时间不到这一刻,谁也不知道音调是怎么样的,直到演奏时间到了,这首曲子也算演奏完了。对于频域,曲子的音调、节奏都已经写到乐谱上了,对懂乐理的人来说,不用花费一首歌的时间,仅仅是看上一眼,这首曲子也就演奏完成了。就像我们不知道自己人生的下一秒会发生什么一样,可说不定我们的下一秒已经写好了,只是等待时间的推动而已。

你可能感兴趣的:(事件轮询&异步IO)