要看的書太多,時間太緊看不完薯鼠,挑核心的部分記錄一下嫉沽。
一辟犀、單線程最大好處是不用像多線程編程那樣處處在意狀態(tài)同步問題,沒有死鎖绸硕,沒有線程上下文交換所帶來的性能上的開銷
缺點:
1.無法利用多核CPU
2.錯誤會引起整個應用退出堂竟,應用健壯性值得考驗
3.大量計算占用CPU導致無法繼續(xù)調(diào)用異步I/O(解決:適當調(diào)整和分解大型運算任務為多個小任務,使得運算能夠適時釋放玻佩,不阻塞I/O調(diào)用的發(fā)起出嘹,這樣既可同時享受到并行異步I/O的好處,又能充分利用CPU)
二咬崔、node采用webworker相同思路解決單線程大量計算問題:child_process(子進程)
三税稼、問題:進程和線程區(qū)別?
進程:是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位垮斯,是一個動態(tài)概念郎仆,競爭計算機系統(tǒng)資源的基本單位。
線程:是進程的一個執(zhí)行單元甚脉,是進程內(nèi)部調(diào)度實體丸升,是處理器調(diào)度的基本單位,是比進程更小的獨立運行的基本單位牺氨。線程也被稱為輕量級進程狡耻。
一個程序至少一個進程墩剖,一個進程至少一個線程。
地址空間:同一進程的線程共享本進程的地址空間夷狰,而進程之間則是獨立的地址空間岭皂。
資源擁有:1.同一進程內(nèi)的線程共享本進程的資源如內(nèi)存、I/O沼头、cpu等爷绘,但是進程之間的資源是獨立的。一個進程崩潰后进倍,在保護模式下不會對其他進程產(chǎn)生影響土至,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯猾昆。2.進程切換時陶因,消耗的資源大,效率高垂蜗。所以涉及到頻繁的切換時楷扬,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發(fā)操作贴见,只能用線程不能用進程烘苹。
四、node 應用場景:擅長I/O密集型應用場景
I/O密集優(yōu)勢主要在于node利用事件循環(huán)的處理能力片部,而不是啟用每一個線程為每個請求服務镣衡,占用資源極少
五、node單線程僅僅是js執(zhí)行在單線程吞琐,在node中無論是*nix還是windows平臺捆探,內(nèi)部完成I/O任務另有線程池
六、node中定時器精確度不夠站粟,改用process.nextTick()方法更高效黍图,每次調(diào)用process.nextTick()方法,只會將回調(diào)函數(shù)放入隊列中奴烙,在下一輪Tick時取出執(zhí)行助被。
process.Tick()和setImmediate()有細微差別,差別在于process的回調(diào)函數(shù)優(yōu)先級要高于setImmediate(也就是執(zhí)行console.log會先輸出)
七切诀、異步實現(xiàn)的核心:事件循環(huán)
進程啟動時揩环,node會創(chuàng)建一個類似于while(true)的循環(huán),每次執(zhí)行一次循環(huán)體的過程稱為Tick幅虑,每個Tick的過程就是查看是否有事件待處理丰滑,如果有,就取出事件及其相關(guān)的回調(diào)函數(shù)倒庵。如果存在關(guān)聯(lián)的回調(diào)函數(shù)褒墨,就執(zhí)行他們炫刷。然后進入下個循環(huán),如果不再有事件處理郁妈,就退出進程浑玛。
八、事件驅(qū)動的實質(zhì):通過主循環(huán)加事件觸發(fā)的方式來運行程序
九噩咪、node高性能的一個原因:通過事件驅(qū)動的方式處理請求顾彰,無須為每個請求創(chuàng)建額外對應線程,可以省掉創(chuàng)建線程和銷毀線程的開銷胃碾,同時操作系統(tǒng)在調(diào)度任務時因為線程較少涨享,上下文切換的代價很低。