Node.js最大的特點就是異步式I/O與事件緊密結合的編程模式。這種模式與傳統的同步式I/O線性的編程思路有很大不同,因為控制流很大程度上要靠事件和回調函數來組織,一個邏輯要拆分為若干個單元格。
典型的多線程有Java,單項程JavaScript
內容
1.同步式I/O或阻塞式I/O
線程在執行中如果遇到磁盤讀寫或網絡通信,通常要消耗較長時間。這時操作系統將這個線程的阻塞狀態解除,恢復其對CPU的控制權、令其繼續執行。
2.異步式I/O或非阻塞式I/O
針對所有I/O操作不采用阻塞策略,當線程遇到I/O操作時,不會以阻塞的方式等待I/O操作的完成或數據的返回,而只是將IO請求發送給操作系統,繼續執行下一條語句,當操作系統完成IO操作時,以事件的形式通知執行IO操作的線程,線程會在特定時候處理這個事件,為了處理異步IO,線程必須有事件循環,不斷的檢查有沒有未處理的事件,依次予以處理。
3.非阻塞與阻塞模式的區別
非阻塞模式下,一個線程永遠在執行計算操作,這個線程所使用的CPU核心利用率永遠是100%,IO以事件的方式通知。
阻塞模式下,多線程往往能提高系統吞吐量,因為一個線程阻塞還有其他線程在工作,多線程可以讓CPU資源不被阻塞中的線程浪費。
4.同步式IO與異步式IO的區別
同步式IO(阻塞式)
利用多線程提供吞吐量
通過事件片分割和線程調度利用多核CPU
需要由操作系統調度多線程使用多核CPU
難以充分利用CPU資源
內存軌跡大,數據局部性弱
符合線性的編程思維
異步式IO(非阻塞)
單線程即可實現高吞吐量
通過功能劃分利用多核
可以將單線程綁定到單核CPU
可以充分利用CPU資源
內存軌跡小,數據局部性強
不符合傳統編程思維
單線程和多線程好處
異步式IO就是少了多線程的開銷,對操作系統來說創建一個線程的代價也是很昂貴,消耗的資源,消耗的時間也是很昂貴,需要給它分配內存,同時在線程切換的時候,還要執行內存換頁,CPU的緩存被清空,也是CPU以前做的緩存都被清空,切換回來的時候又要重新從內存中讀取信息,破壞了數據的局部性,它的局部性比較弱