要看的書(shū)太多,時(shí)間太緊看不完,挑核心的部分記錄一下。
一、單線(xiàn)程最大好處是不用像多線(xiàn)程編程那樣處處在意狀態(tài)同步問(wèn)題,沒(méi)有死鎖,沒(méi)有線(xiàn)程上下文交換所帶來(lái)的性能上的開(kāi)銷(xiāo)
缺點(diǎn):
1.無(wú)法利用多核CPU
2.錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出,應(yīng)用健壯性值得考驗(yàn)
3.大量計(jì)算占用CPU導(dǎo)致無(wú)法繼續(xù)調(diào)用異步I/O(解決:適當(dāng)調(diào)整和分解大型運(yùn)算任務(wù)為多個(gè)小任務(wù),使得運(yùn)算能夠適時(shí)釋放,不阻塞I/O調(diào)用的發(fā)起,這樣既可同時(shí)享受到并行異步I/O的好處,又能充分利用CPU)
二、node采用webworker相同思路解決單線(xiàn)程大量計(jì)算問(wèn)題:child_process(子進(jìn)程)
三、問(wèn)題:進(jìn)程和線(xiàn)程區(qū)別?
進(jìn)程:是并發(fā)執(zhí)行的程序在執(zhí)行過(guò)程中分配和管理資源的基本單位,是一個(gè)動(dòng)態(tài)概念,競(jìng)爭(zhēng)計(jì)算機(jī)系統(tǒng)資源的基本單位。
線(xiàn)程:是進(jìn)程的一個(gè)執(zhí)行單元,是進(jìn)程內(nèi)部調(diào)度實(shí)體,是處理器調(diào)度的基本單位,是比進(jìn)程更小的獨(dú)立運(yùn)行的基本單位。線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。
一個(gè)程序至少一個(gè)進(jìn)程,一個(gè)進(jìn)程至少一個(gè)線(xiàn)程。
地址空間:同一進(jìn)程的線(xiàn)程共享本進(jìn)程的地址空間,而進(jìn)程之間則是獨(dú)立的地址空間。
資源擁有:1.同一進(jìn)程內(nèi)的線(xiàn)程共享本進(jìn)程的資源如內(nèi)存、I/O、cpu等,但是進(jìn)程之間的資源是獨(dú)立的。一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線(xiàn)程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線(xiàn)程健壯。2.進(jìn)程切換時(shí),消耗的資源大,效率高。所以涉及到頻繁的切換時(shí),使用線(xiàn)程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線(xiàn)程不能用進(jìn)程。
四、node 應(yīng)用場(chǎng)景:擅長(zhǎng)I/O密集型應(yīng)用場(chǎng)景
I/O密集優(yōu)勢(shì)主要在于node利用事件循環(huán)的處理能力,而不是啟用每一個(gè)線(xiàn)程為每個(gè)請(qǐng)求服務(wù),占用資源極少
五、node單線(xiàn)程僅僅是js執(zhí)行在單線(xiàn)程,在node中無(wú)論是*nix還是windows平臺(tái),內(nèi)部完成I/O任務(wù)另有線(xiàn)程池
六、node中定時(shí)器精確度不夠,改用process.nextTick()方法更高效,每次調(diào)用process.nextTick()方法,只會(huì)將回調(diào)函數(shù)放入隊(duì)列中,在下一輪Tick時(shí)取出執(zhí)行。
process.Tick()和setImmediate()有細(xì)微差別,差別在于process的回調(diào)函數(shù)優(yōu)先級(jí)要高于setImmediate(也就是執(zhí)行console.log會(huì)先輸出)
七、異步實(shí)現(xiàn)的核心:事件循環(huán)
進(jìn)程啟動(dòng)時(shí),node會(huì)創(chuàng)建一個(gè)類(lèi)似于while(true)的循環(huán),每次執(zhí)行一次循環(huán)體的過(guò)程稱(chēng)為T(mén)ick,每個(gè)Tick的過(guò)程就是查看是否有事件待處理,如果有,就取出事件及其相關(guān)的回調(diào)函數(shù)。如果存在關(guān)聯(lián)的回調(diào)函數(shù),就執(zhí)行他們。然后進(jìn)入下個(gè)循環(huán),如果不再有事件處理,就退出進(jìn)程。
八、事件驅(qū)動(dòng)的實(shí)質(zhì):通過(guò)主循環(huán)加事件觸發(fā)的方式來(lái)運(yùn)行程序
九、node高性能的一個(gè)原因:通過(guò)事件驅(qū)動(dòng)的方式處理請(qǐng)求,無(wú)須為每個(gè)請(qǐng)求創(chuàng)建額外對(duì)應(yīng)線(xiàn)程,可以省掉創(chuàng)建線(xiàn)程和銷(xiāo)毀線(xiàn)程的開(kāi)銷(xiāo),同時(shí)操作系統(tǒng)在調(diào)度任務(wù)時(shí)因?yàn)榫€(xiàn)程較少,上下文切換的代價(jià)很低。