前端百題斬—原來瀏覽器中存在五類進(jìn)程
瀏覽器已經(jīng)從單進(jìn)程瀏覽器階段進(jìn)化到多進(jìn)程瀏覽器階段,那么瀏覽器的多進(jìn)程指的是哪些進(jìn)程呢?下面一起來看看。
1.瀏覽器進(jìn)程
打開瀏覽器后只有一個(gè),主要負(fù)責(zé)界面顯示、用戶交互、子進(jìn)程關(guān)閉,除此之外,還會(huì)提供存儲(chǔ)等功能。
2.渲染進(jìn)程
其主要作用是頁面渲染、腳本執(zhí)行、事件處理等,默認(rèn)情況下,Chrome會(huì)為每個(gè)Tab標(biāo)簽創(chuàng)建一個(gè)渲染進(jìn)程(注意:出于安全考慮,渲染進(jìn)程都運(yùn)行在沙箱模式下)。對(duì)于渲染進(jìn)程其是由多線程組成,多線程包含以下幾個(gè):
(1)GUI渲染線程
主要負(fù)責(zé)渲染瀏覽器界面,解析HTML、CSS、構(gòu)建DOM樹和RenderObject樹,布局和繪制等。當(dāng)界面需要重繪或重排時(shí),該線程就會(huì)執(zhí)行。
(2)JS引擎線程
主要負(fù)責(zé)解析并執(zhí)行JS代碼。
(注意:JS引擎線程和GUI渲染線程是互斥關(guān)系,當(dāng)JS引擎線程執(zhí)行時(shí)GUI線程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎空閑時(shí)立即執(zhí)行,所以JS執(zhí)行的時(shí)間過程,就會(huì)造成頁面的渲染不連貫,導(dǎo)致頁面渲染加載阻塞)
(3)事件觸發(fā)線程
用來控制事件循環(huán),當(dāng)js引擎執(zhí)行代碼時(shí),會(huì)將對(duì)應(yīng)的任務(wù)(例如Ajax任務(wù)、鼠標(biāo)點(diǎn)擊……)添加到事件線程中,當(dāng)事件被觸發(fā)時(shí),事件線程會(huì)把事件添加到待處理事件隊(duì)列的隊(duì)尾,等待js引擎的處理。
(4)定時(shí)觸發(fā)器線程
setInterval和setTimeout所在的線程,瀏覽器定時(shí)計(jì)數(shù)器并不是由JavaScript引擎計(jì)數(shù)的,通過單獨(dú)的線程來計(jì)時(shí)并觸發(fā)定時(shí)。(W3C在HTML標(biāo)準(zhǔn)中規(guī)定,setTimeout中低于4ms的時(shí)間間隔算4ms)
(5)異步http請(qǐng)求線程
用于處理請(qǐng)求XMLHttpRequest,在連接后是通過瀏覽器新開一個(gè)線程請(qǐng)求。
3.GPU進(jìn)程
GPU進(jìn)程只有一個(gè)。GPU使用初衷是為了實(shí)現(xiàn)3D CSS的效果,知識(shí)隨著網(wǎng)頁、Chrome的UI界面都選擇采用GPU來繪制,使得GPU成為瀏覽器的普遍需求,最后,Chrome在其多進(jìn)程架構(gòu)上也引入了GPU進(jìn)程。
4.網(wǎng)絡(luò)進(jìn)程
只有一個(gè),主要負(fù)責(zé)頁面的網(wǎng)絡(luò)資源加載。
5.插件進(jìn)程
每個(gè)類型的插件對(duì)應(yīng)著一個(gè)進(jìn)程,主要負(fù)責(zé)插件的運(yùn)行。因?yàn)椴寮妆罎ⅲ孕枰ㄟ^插件進(jìn)程來隔離,以保證插件進(jìn)程崩潰不會(huì)對(duì)瀏覽器和頁面造成影響。