20121124.Nodejs异步式I/O与事件式编程

异步:
你请人吃饭,准备一块儿去的。结果那人恰好有事,让你先去点菜,你去点好菜,他忙完就来了,这就是异步的优点(不耽误事!)
同步:
就是,你必须等那我的忙完了,才一块儿去(浪费时间)
理解来源于群友“老了学nodejs”
 
一、Nodejs最大的特色就是异步式I/O(或者非阻塞I/O)与事件紧密结合的编程模型。此模型与传统的同步式I/O线性的编程思想有很大不一样,由于控制流在很大程度上须要事件和回调函数来组织,一个逻辑要拆分为若干个单元。
 
二、什么是阻塞式(同步式I/O):
    线程在执行中若是遇到磁盘读写或者网络通讯(统称I/O操做),一般要耗费较长时间,这时操做系统会剥夺这个线程对CPU的控制权,使其暂停执行,同时将资源让给其余的工做线程,这种线程调度方式称为阻塞式。
    当I/O操做完毕时候,操做系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行,这种模式就是同步式I/O(Synchronous I/O)或者阻塞式(Blocking I/O)
 
三、异步式I/O:
    当线程遇到I/O操做时,不会以阻塞的方式等待I/O操做的完成或者数据的返回,而只是将I/O的请求发送给操做系统,继续执行下一条语句。当操做系统完成I/O的操做时,以事件的形式通知执行I/O操做的线程,线程会在特定的时间处理这个事件。
    为了处理异步I/O,线程必须有事件循环,不断的检测有没有未处理的事件,依次予以处理。
 
四、阻塞模式下一个线程只能处理一项任务,要想提升吞吐量,必须使用多线程。而非阻塞模式下,一个线程永远在执行计算操做,这个线程所使用的CPU核心利用率永远是100%。多线程带来的好处是在多核CPU的状况下利用更多的核,而Nodejs的单线程也能带来一样的好处。
 
五、单线程事件相比传统的多线程阻塞I/O的优缺点?
    优:多线程的开销,建立一个线程对OS来说代价仍是比较大的(须要分配内存,列入调度、线程切换时内存换页,CPU缓存清理)。
    缺:异步式编程不符合人们对于通常程序的设计思惟,容易让流程控制变得隐晦难懂!
 
六、同步式I/O和异步式I/O特色对比:    
同步式(I/O)
异步式(I/O)
利用多线程提供吞吐量
单线程便可实现高吞吐量
经过事件片分割和线程调度利用多核CPU
经过功能划分利用多核CPU
须要由操做系统调度多线程使用多核CPU
能够将单进程绑定到单核CPU上
难以充分利用CPU资源
能够充分利用CPU资源
内存轨迹大,数据局部性若
内存轨迹小,数据局部性强
符合线性的编程思想
不符合传统编程思想
PS:为毛每一个语言都说本身好得不得了,这也得广告一把?


相关文章
相关标签/搜索