摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。
進(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)程帶來的好處是明顯的,比如你可以聽歌的同時(shí),打開編輯器敲代碼,編輯器和聽歌軟件的進(jìn)程之間絲毫不會(huì)相互干擾。
瀏覽器是多進(jìn)程的,瀏覽器的進(jìn)程主要包括以下幾種:Browser進(jìn)程:瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào),主控)
第三方插件進(jìn)程:每種類型的插件對(duì)應(yīng)一個(gè)進(jìn)程,僅當(dāng)使用該插件時(shí)才創(chuàng)建
GPU進(jìn)程:最多一個(gè),用于3D繪制
瀏覽器渲染進(jìn)程(內(nèi)核):默認(rèn)每個(gè)Tab頁面一個(gè)進(jìn)程,互不影響,控制頁面渲染,腳本執(zhí)行,事件處理等(有時(shí)候會(huì)優(yōu)化,如多個(gè)空白tab會(huì)合并成一個(gè)進(jìn)程)
在瀏覽網(wǎng)頁時(shí),同時(shí)打開幾個(gè)新的頁面, 這就要打開幾個(gè)瀏覽窗口,但一旦開啟十幾個(gè)窗口,整個(gè)計(jì)算機(jī)就會(huì)越來越慢。
多進(jìn)程瀏覽器的優(yōu)點(diǎn)避免頁面渲染影響整個(gè)瀏覽器
避免第三方插件影響整個(gè)瀏覽器
多進(jìn)程充分利用多核優(yōu)勢(shì)
方便使用沙盒模型隔離插件等進(jìn)程,提高瀏覽器穩(wěn)定性
通俗的講,就是用戶打開多個(gè)窗口,如果其中一個(gè)窗口崩掉了,也不會(huì)影響整個(gè)瀏覽器,其他的界面照樣正常運(yùn)行
線程一個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線;
進(jìn)程之間相互獨(dú)立,但同一進(jìn)程下的各個(gè)線程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進(jìn)程級(jí)的資源(如打開文件和信號(hào))。
瀏覽器的渲染進(jìn)程(瀏覽器內(nèi)核),是多線程的,主要以下幾大類:GUI線程
Javascript引擎線程
事件觸發(fā)線程
定時(shí)器線程
網(wǎng)絡(luò)請(qǐng)求線程
GUI線程負(fù)責(zé)渲染瀏覽器界面HTML元素,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線程就會(huì)執(zhí)行。在Javascript引擎運(yùn)行腳本期間,GUI渲染線程都是處于掛起狀態(tài)的,也就是說被”凍結(jié)”了.
Javascript引擎線程也可以稱為JS內(nèi)核,主要負(fù)責(zé)處理Javascript腳本程序,例如V8引擎。Javascript引擎線程理所當(dāng)然是負(fù)責(zé)解析Javascript腳本,運(yùn)行代碼。
Javascript是單線程的這是因?yàn)镴avascript這門腳本語言誕生的使命所致:JavaScript為處理頁面中用戶的交互,以及操作DOM樹、CSS樣式樹來給用戶呈現(xiàn)一份動(dòng)態(tài)而豐富的交互體驗(yàn)和服務(wù)器邏輯的交互處理。如果JavaScript是多線程的方式來操作這些UI DOM,則可能出現(xiàn)UI操作的沖突; 如果Javascript是多線程的話,在多線程的交互下,處于UI中的DOM節(jié)點(diǎn)就可能成為一個(gè)臨界資源,假設(shè)存在兩個(gè)線程同時(shí)操作一個(gè)DOM,一個(gè)負(fù)責(zé)修改一個(gè)負(fù)責(zé)刪除,那么這個(gè)時(shí)候就需要瀏覽器來裁決如何生效哪個(gè)線程的執(zhí)行結(jié)果。當(dāng)然我們可以通過鎖來解決上面的問題。但為了避免因?yàn)橐肓随i而帶來更大的復(fù)雜性,Javascript在最初就選擇了單線程執(zhí)行。
GUI 渲染線程 與 JavaScript引擎線程互斥!由于JavaScript是可操縱DOM的,如果在修改這些元素屬性同時(shí)渲染界面(即JavaScript線程和UI線程同時(shí)運(yùn)行),那么渲染線程前后獲得的元素?cái)?shù)據(jù)就可能不一致了。因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置GUI渲染線程與JavaScript引擎為互斥的關(guān)系,當(dāng)JavaScript引擎執(zhí)行時(shí)GUI線程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到引擎線程空閑時(shí)立即被執(zhí)行。
JS阻塞頁面加載由于GUI渲染線程與JavaScript執(zhí)行線程是互斥的關(guān)系,當(dāng)瀏覽器在執(zhí)行JavaScript程序的時(shí)候,GUI渲染線程會(huì)被保存在一個(gè)隊(duì)列中,直到JS程序執(zhí)行完成,才會(huì)接著執(zhí)行。因此如果JS執(zhí)行的時(shí)間過長(zhǎng),這樣就會(huì)造成頁面的渲染不連貫,導(dǎo)致頁面渲染加載阻塞的感覺。
定時(shí)觸發(fā)器線程瀏覽器定時(shí)計(jì)數(shù)器并不是由JavaScript引擎計(jì)數(shù)的, 因?yàn)镴avaScript引擎是單線程的, 如果處于阻塞線程狀態(tài)就會(huì)影響記計(jì)時(shí)的準(zhǔn)確, 因此通過多帶帶線程來計(jì)時(shí)并觸發(fā)定時(shí)是更為合理的方案。
事件觸發(fā)線程當(dāng)一個(gè)事件被觸發(fā)時(shí)該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可以是當(dāng)前執(zhí)行的代碼塊如定時(shí)任務(wù)、也可來自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊、AJAX異步請(qǐng)求等,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。
異步http請(qǐng)求線程在XMLHttpRequest在連接后是通過瀏覽器新開一個(gè)線程請(qǐng)求, 將檢測(cè)到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件放到 JavaScript引擎的處理隊(duì)列中等待處理。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/114223.html
摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。 進(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)程帶來的好處是明顯的,比如你可以聽歌的同時(shí),打開編輯器敲代碼,編...
摘要:瀏覽器的渲染進(jìn)程瀏覽器內(nèi)核,是多線程的,主要以下幾大類線程引擎線程事件觸發(fā)線程定時(shí)器線程網(wǎng)絡(luò)請(qǐng)求線程線程負(fù)責(zé)渲染瀏覽器界面元素當(dāng)界面需要重繪或由于某種操作引發(fā)回流時(shí)該線程就會(huì)執(zhí)行。 進(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)程帶來的好處是明顯的,比如你可以聽歌的同時(shí),打開編輯器敲代碼,編...
摘要:若以多線程的方式操作這些,則可能出現(xiàn)操作的沖突。另外,因?yàn)槭菃尉€程的,在某一時(shí)刻內(nèi)只能執(zhí)行特定的一個(gè)任務(wù),并且會(huì)阻塞其它任務(wù)執(zhí)行。瀏覽器事件觸發(fā)線程事件觸發(fā)線程,當(dāng)一個(gè)事件被觸發(fā)時(shí)該線程會(huì)把事件添加到任務(wù)隊(duì)列的隊(duì)尾,等待引擎的處理。 首先,說下為什么 JavaScript 是單線程? 總所周知,JavaScript是以單線程的方式運(yùn)行的。說到線程就自然聯(lián)想到進(jìn)程。那它們有什么聯(lián)系呢? ...
摘要:渲染引擎也稱為呈現(xiàn)引擎瀏覽器內(nèi)核,負(fù)責(zé)顯示請(qǐng)求的內(nèi)容。引擎是基于事件驅(qū)動(dòng)單線程執(zhí)行的,引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時(shí)候都只有一個(gè)線程在運(yùn)行程序。 1 瀏覽器結(jié)構(gòu) showImg(https://segmentfault.com/img/bVk7AU); 瀏覽器分為以下7個(gè)部分: 用戶界面 瀏覽器引擎:在用戶界面和呈現(xiàn)引擎之間傳送指令。 渲染引擎:也...
閱讀 3197·2021-11-10 11:36
閱讀 3145·2021-11-02 14:39
閱讀 1726·2021-09-26 10:11
閱讀 4928·2021-09-22 15:57
閱讀 1685·2021-09-09 11:36
閱讀 2053·2019-08-30 12:56
閱讀 3487·2019-08-30 11:17
閱讀 1702·2019-08-29 17:17