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:爲毛每一個語言都說本身好得不得了,這也得廣告一把?


相關文章
相關標籤/搜索