進(jìn)程
進(jìn)程是cpu的資源分配的最小單位。
多進(jìn)程:多進(jìn)程指的是在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài)。多進(jìn)程帶來(lái)的好處是明顯的,比如你可以聽(tīng)歌的同時(shí),打開(kāi)編輯器敲代碼,編輯器和聽(tīng)歌軟件的進(jìn)程之間絲毫不會(huì)相互干擾。
瀏覽器是多進(jìn)程的,瀏覽器的進(jìn)程主要包括以下幾種:
Browser進(jìn)程:瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào),主控)
第三方插件進(jìn)程:每種類(lèi)型的插件對(duì)應(yīng)一個(gè)進(jìn)程,僅當(dāng)使用該插件時(shí)才創(chuàng)建
GPU進(jìn)程:最多一個(gè),用于3D繪制
瀏覽器渲染進(jìn)程(內(nèi)核):默認(rèn)每個(gè)Tab頁(yè)面一個(gè)進(jìn)程,互不影響,控制頁(yè)面渲染,腳本執(zhí)行,事件處理等(有時(shí)候會(huì)優(yōu)化,如多個(gè)空白tab會(huì)合并成一個(gè)進(jìn)程)
在瀏覽網(wǎng)頁(yè)時(shí),同時(shí)打開(kāi)幾個(gè)新的頁(yè)面, 這就要打開(kāi)幾個(gè)瀏覽窗口,但一旦開(kāi)啟十幾個(gè)窗口,整個(gè)計(jì)算機(jī)就會(huì)越來(lái)越慢。
多進(jìn)程瀏覽器的優(yōu)點(diǎn)
避免頁(yè)面渲染影響整個(gè)瀏覽器
避免第三方插件影響整個(gè)瀏覽器
多進(jìn)程充分利用多核優(yōu)勢(shì)
方便使用沙盒模型隔離插件等進(jìn)程,提高瀏覽器穩(wěn)定性
通俗的講,就是用戶(hù)打開(kāi)多個(gè)窗口,如果其中一個(gè)窗口崩掉了,也不會(huì)影響整個(gè)瀏覽器,其他的界面照樣正常運(yùn)行
線(xiàn)程
一個(gè)進(jìn)程由一個(gè)或多個(gè)線(xiàn)程組成,線(xiàn)程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線(xiàn);
進(jìn)程之間相互獨(dú)立,但同一進(jìn)程下的各個(gè)線(xiàn)程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進(jìn)程級(jí)的資源(如打開(kāi)文件和信號(hào))。
瀏覽器的渲染進(jìn)程(瀏覽器內(nèi)核),是多線(xiàn)程的,主要以下幾大類(lèi):
GUI線(xiàn)程
Javascript引擎線(xiàn)程
事件觸發(fā)線(xiàn)程
定時(shí)器線(xiàn)程
網(wǎng)絡(luò)請(qǐng)求線(xiàn)程
GUI線(xiàn)程
負(fù)責(zé)渲染瀏覽器界面HTML元素,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線(xiàn)程就會(huì)執(zhí)行。在Javascript引擎運(yùn)行腳本期間,GUI渲染線(xiàn)程都是處于掛起狀態(tài)的,也就是說(shuō)被”凍結(jié)”了.
Javascript引擎線(xiàn)程
也可以稱(chēng)為JS內(nèi)核,主要負(fù)責(zé)處理Javascript腳本程序,例如V8引擎。Javascript引擎線(xiàn)程理所當(dāng)然是負(fù)責(zé)解析Javascript腳本,運(yùn)行代碼。
Javascript是單線(xiàn)程的
這是因?yàn)镴avascript這門(mén)腳本語(yǔ)言誕生的使命所致:JavaScript為處理頁(yè)面中用戶(hù)的交互,以及操作DOM樹(shù)、CSS樣式樹(shù)來(lái)給用戶(hù)呈現(xiàn)一份動(dòng)態(tài)而豐富的交互體驗(yàn)和服務(wù)器邏輯的交互處理。如果JavaScript是多線(xiàn)程的方式來(lái)操作這些UI DOM,則可能出現(xiàn)UI操作的沖突; 如果Javascript是多線(xiàn)程的話(huà),在多線(xiàn)程的交互下,處于UI中的DOM節(jié)點(diǎn)就可能成為一個(gè)臨界資源,假設(shè)存在兩個(gè)線(xiàn)程同時(shí)操作一個(gè)DOM,一個(gè)負(fù)責(zé)修改一個(gè)負(fù)責(zé)刪除,那么這個(gè)時(shí)候就需要瀏覽器來(lái)裁決如何生效哪個(gè)線(xiàn)程的執(zhí)行結(jié)果。當(dāng)然我們可以通過(guò)鎖來(lái)解決上面的問(wèn)題。但為了避免因?yàn)橐肓随i而帶來(lái)更大的復(fù)雜性,Javascript在最初就選擇了單線(xiàn)程執(zhí)行。
GUI 渲染線(xiàn)程 與 JavaScript引擎線(xiàn)程互斥!
由于JavaScript是可操縱DOM的,如果在修改這些元素屬性同時(shí)渲染界面(即JavaScript線(xiàn)程和UI線(xiàn)程同時(shí)運(yùn)行),那么渲染線(xiàn)程前后獲得的元素?cái)?shù)據(jù)就可能不一致了。因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置GUI渲染線(xiàn)程與JavaScript引擎為互斥的關(guān)系,當(dāng)JavaScript引擎執(zhí)行時(shí)GUI線(xiàn)程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到引擎線(xiàn)程空閑時(shí)立即被執(zhí)行。
JS阻塞頁(yè)面加載
由于GUI渲染線(xiàn)程與JavaScript執(zhí)行線(xiàn)程是互斥的關(guān)系,當(dāng)瀏覽器在執(zhí)行JavaScript程序的時(shí)候,GUI渲染線(xiàn)程會(huì)被保存在一個(gè)隊(duì)列中,直到JS程序執(zhí)行完成,才會(huì)接著執(zhí)行。因此如果JS執(zhí)行的時(shí)間過(guò)長(zhǎng),這樣就會(huì)造成頁(yè)面的渲染不連貫,導(dǎo)致頁(yè)面渲染加載阻塞的感覺(jué)。
定時(shí)觸發(fā)器線(xiàn)程
瀏覽器定時(shí)計(jì)數(shù)器并不是由JavaScript引擎計(jì)數(shù)的, 因?yàn)镴avaScript引擎是單線(xiàn)程的, 如果處于阻塞線(xiàn)程狀態(tài)就會(huì)影響記計(jì)時(shí)的準(zhǔn)確, 因此通過(guò)單獨(dú)線(xiàn)程來(lái)計(jì)時(shí)并觸發(fā)定時(shí)是更為合理的方案。
事件觸發(fā)線(xiàn)程
當(dāng)一個(gè)事件被觸發(fā)時(shí)該線(xiàn)程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可以是當(dāng)前執(zhí)行的代碼塊如定時(shí)任務(wù)、也可來(lái)自瀏覽器內(nèi)核的其他線(xiàn)程如鼠標(biāo)點(diǎn)擊、AJAX異步請(qǐng)求等,但由于JS的單線(xiàn)程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。
異步http請(qǐng)求線(xiàn)程
在XMLHttpRequest在連接后是通過(guò)瀏覽器新開(kāi)一個(gè)線(xiàn)程請(qǐng)求, 將檢測(cè)到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù),異步線(xiàn)程就產(chǎn)生狀態(tài)變更事件放到 JavaScript引擎的處理隊(duì)列中等待處理。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com