之前一直對單線程這個(gè)有誤解客给,一直以為javascript中的單線程理解有偏差袜漩,但是當(dāng)運(yùn)行在服務(wù)端上的js是單線程的甜害,能承載日益增長的網(wǎng)絡(luò)流量和大量的網(wǎng)絡(luò)請求嗎通砍?似乎越來越不適合這個(gè)時(shí)代的發(fā)展了冤灾。
今天就來好好探討一下js中的單線程前域!
1、Node 是單線程的指的是 JavaScript 的執(zhí)行是單線程的韵吨,但 Javascript 的宿主環(huán)境匿垄,無論是 Node 還是瀏覽器都是多線程的
2、在 Node 啟動(dòng)后归粉,會(huì)創(chuàng)建 v8 的實(shí)例椿疗,這個(gè)實(shí)例是多線程的
但是node也有一些缺點(diǎn),比如對 cpu 利用不足糠悼,某個(gè)未捕獲的異辰扉可能會(huì)導(dǎo)致整個(gè)程序的退出等等
進(jìn)程和線程的區(qū)別
進(jìn)程:是資源(CPU、內(nèi)存等)分配的基本單位它是程序執(zhí)行時(shí)的一個(gè)實(shí)例倔喂。程序運(yùn)行時(shí)系統(tǒng)就會(huì)創(chuàng)建一個(gè)進(jìn)程痒蓬,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊(duì)列滴劲,進(jìn)程調(diào)度器選中它的時(shí)候就會(huì)為它分配CPU時(shí)間攻晒,程序開始真正運(yùn)行
線程:程序執(zhí)行時(shí)的最小單位它是進(jìn)程的一個(gè)執(zhí)行流,是CPU調(diào)度和分派的基本單位一個(gè)進(jìn)程可以由很多個(gè)線程組成班挖,線程間共享進(jìn)程的所有資源鲁捏,線程由CPU獨(dú)立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個(gè)線程同時(shí)運(yùn)行。同樣多線程也可以實(shí)現(xiàn)并發(fā)操作给梅,每個(gè)請求分配一個(gè)線程來處理
區(qū)別/優(yōu)劣
進(jìn)程是資源分配的最小單位假丧,線程是程序執(zhí)行的最小單位。
進(jìn)程有自己的獨(dú)立地址空間动羽,每啟動(dòng)一個(gè)進(jìn)程包帚,系統(tǒng)就會(huì)為它分配地址空間,建立數(shù)據(jù)表來維護(hù)代碼段运吓、堆棧段和數(shù)據(jù)段渴邦,這種操作非常昂貴。而線程是共享進(jìn)程中的數(shù)據(jù)的拘哨,使用相同的地址空間谋梭,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多,同時(shí)創(chuàng)建一個(gè)線程的開銷也比進(jìn)程要小很多倦青。
線程之間的通信更方便瓮床,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù)产镐,而進(jìn)程之間的通信需要以通信的方式進(jìn)行隘庄。不過如何處理好同步與互斥是編寫多線程程序的難點(diǎn)。
但是多進(jìn)程程序更健壯癣亚,多線程程序只要有一個(gè)線程死掉丑掺,整個(gè)進(jìn)程也死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對另外一個(gè)進(jìn)程造成影響逃糟,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間。