Node.js最大的特點(diǎn)就是異步式I/O與事件緊密結(jié)合的編程模式庆尘。這種模式與傳統(tǒng)的同步式I/O線性的編程思路有很大不同剃诅,因?yàn)榭刂屏骱艽蟪潭壬弦渴录突卣{(diào)函數(shù)來(lái)組織,一個(gè)邏輯要拆分為若干個(gè)單元格驶忌。
典型的多線程有Java矛辕,單項(xiàng)程JavaScript
內(nèi)容
1.同步式I/O或阻塞式I/O
線程在執(zhí)行中如果遇到磁盤(pán)讀寫(xiě)或網(wǎng)絡(luò)通信,通常要消耗較長(zhǎng)時(shí)間付魔。這時(shí)操作系統(tǒng)將這個(gè)線程的阻塞狀態(tài)解除聊品,恢復(fù)其對(duì)CPU的控制權(quán)、令其繼續(xù)執(zhí)行几苍。
2.異步式I/O或非阻塞式I/O
針對(duì)所有I/O操作不采用阻塞策略翻屈,當(dāng)線程遇到I/O操作時(shí),不會(huì)以阻塞的方式等待I/O操作的完成或數(shù)據(jù)的返回妻坝,而只是將IO請(qǐng)求發(fā)送給操作系統(tǒng)妖胀,繼續(xù)執(zhí)行下一條語(yǔ)句,當(dāng)操作系統(tǒng)完成IO操作時(shí)惠勒,以事件的形式通知執(zhí)行IO操作的線程赚抡,線程會(huì)在特定時(shí)候處理這個(gè)事件,為了處理異步IO纠屋,線程必須有事件循環(huán)涂臣,不斷的檢查有沒(méi)有未處理的事件,依次予以處理售担。
3.非阻塞與阻塞模式的區(qū)別
非阻塞模式下赁遗,一個(gè)線程永遠(yuǎn)在執(zhí)行計(jì)算操作,這個(gè)線程所使用的CPU核心利用率永遠(yuǎn)是100%族铆,IO以事件的方式通知岩四。
阻塞模式下,多線程往往能提高系統(tǒng)吞吐量哥攘,因?yàn)橐粋€(gè)線程阻塞還有其他線程在工作剖煌,多線程可以讓CPU資源不被阻塞中的線程浪費(fèi)材鹦。
4.同步式IO與異步式IO的區(qū)別
同步式IO(阻塞式)
利用多線程提供吞吐量
通過(guò)事件片分割和線程調(diào)度利用多核CPU
需要由操作系統(tǒng)調(diào)度多線程使用多核CPU
難以充分利用CPU資源
內(nèi)存軌跡大,數(shù)據(jù)局部性弱
符合線性的編程思維
異步式IO(非阻塞)
單線程即可實(shí)現(xiàn)高吞吐量
通過(guò)功能劃分利用多核
可以將單線程綁定到單核CPU
可以充分利用CPU資源
內(nèi)存軌跡小耕姊,數(shù)據(jù)局部性強(qiáng)
不符合傳統(tǒng)編程思維
單線程和多線程好處
異步式IO就是少了多線程的開(kāi)銷(xiāo)桶唐,對(duì)操作系統(tǒng)來(lái)說(shuō)創(chuàng)建一個(gè)線程的代價(jià)也是很昂貴,消耗的資源茉兰,消耗的時(shí)間也是很昂貴尤泽,需要給它分配內(nèi)存,同時(shí)在線程切換的時(shí)候规脸,還要執(zhí)行內(nèi)存換頁(yè)坯约,CPU的緩存被清空,也是CPU以前做的緩存都被清空莫鸭,切換回來(lái)的時(shí)候又要重新從內(nèi)存中讀取信息鬼店,破壞了數(shù)據(jù)的局部性,它的局部性比較弱