前言:此文為李兵老師的《瀏覽器工作原理與實(shí)踐》課程的學(xué)習(xí)筆記加上個(gè)人總結(jié)倔矾。
概念:進(jìn)程與線程
進(jìn)程是一個(gè)程序的運(yùn)行實(shí)例,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位柱锹。當(dāng)啟動(dòng)一個(gè)程序的時(shí)候破讨,操作系統(tǒng)會(huì)為該程序創(chuàng)建一個(gè)內(nèi)存用于存放代碼運(yùn)行中的數(shù)據(jù)和一個(gè)執(zhí)行任務(wù)的主線程。我們把這樣的環(huán)境稱為進(jìn)程奕纫。
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位烫沙,它是比進(jìn)程更小匹层。
以上的術(shù)語都比較抽象。打個(gè)比方:
如果用進(jìn)程比作一列火車,那么線程就是組成火車的一節(jié)節(jié)車廂升筏。
線程與進(jìn)程的關(guān)系
- 線程依附于進(jìn)程(車廂無法獨(dú)立運(yùn)行)
- 一個(gè)進(jìn)程可以包含多個(gè)線程(一列火車包含多個(gè)車廂)
- 不同進(jìn)程間只能通過IPC通信(不同火車上的乘客只能通過月臺(tái)換乘)
- 進(jìn)程間不會(huì)相互影響(不同火車不會(huì)互相影響)
- 一個(gè)線程的崩潰導(dǎo)致整個(gè)進(jìn)程的崩潰(一節(jié)車廂壞了導(dǎo)致火車停運(yùn))
- 進(jìn)程間的線程共享進(jìn)程的數(shù)據(jù)(火車中的乘客能自由穿梭不同車廂)
并行處理 :一般是指許多指令得以同時(shí)進(jìn)行的計(jì)算模式撑柔。
也就是說計(jì)算機(jī)在同一時(shí)刻處理多個(gè)任務(wù)灵汪。
舉例:
A=1+1;
B=1+2;
C=1+3;
如果用單線程處理,如圖所示:
需要四個(gè)步驟才能完成。
如果用多線程處理,如圖所示:
而采用多線程處理夹孔,只需兩個(gè)步驟就能完成。所以使用多線程并行處理能提高運(yùn)行效率。
chrome下的多進(jìn)程架構(gòu)
如圖所示:
從圖中可以看出chrome架構(gòu)包括:1個(gè)瀏覽器進(jìn)程(Browser Process)擅这、1個(gè)網(wǎng)絡(luò)進(jìn)程(NetWork Process)、1個(gè)插件進(jìn)程(Plugin Process)、1個(gè)GPU進(jìn)程(GPU Process)與多個(gè)渲染進(jìn)程(Render Process)结笨。
每個(gè)進(jìn)程負(fù)責(zé)的任務(wù):
- 瀏覽器進(jìn)程:負(fù)責(zé)用戶交互、數(shù)據(jù)存儲(chǔ)嘴瓤、子進(jìn)程管理以及界面顯示等功能磁玉。
- 插件進(jìn)程:負(fù)責(zé)插件的管理。因插件容易崩潰颅停,為防止其崩潰從而影響到頁面喊熟,所以將其隔離起來壁拉。
- GPU進(jìn)程:負(fù)責(zé)UI界面的繪制和3DCSS的實(shí)現(xiàn)宿礁。
- 網(wǎng)絡(luò)進(jìn)程:負(fù)責(zé)網(wǎng)絡(luò)資源加載。
- 渲染器進(jìn)程:主要負(fù)責(zé)將HTML街佑、CSS和JavaScript轉(zhuǎn)化為網(wǎng)頁榨婆。默認(rèn)情況下瀏覽器為每個(gè)頁面創(chuàng)建一個(gè)渲染進(jìn)程。出于安全考慮吊档,將渲染進(jìn)程運(yùn)行在沙箱里面。
所以打開一個(gè)頁面至少運(yùn)行4個(gè)進(jìn)程葡秒,分別是1個(gè)網(wǎng)絡(luò)進(jìn)程、1個(gè)渲染進(jìn)程扣囊、1個(gè)GPU進(jìn)程和1個(gè)瀏覽器進(jìn)程骂澄。如果有插件還會(huì)有插件進(jìn)程。
渲染進(jìn)程的個(gè)數(shù)
默認(rèn)情況下酒唉,瀏覽器進(jìn)程會(huì)為每一個(gè)頁面創(chuàng)建一個(gè)渲染進(jìn)程痪伦。但是從一個(gè)頁面打開另一個(gè)頁面辉哥,而且這兩個(gè)頁面同屬站點(diǎn)時(shí)饲齐,會(huì)共用一個(gè)渲染進(jìn)程。
但是分別打開的時(shí)候又會(huì)是不同的進(jìn)程:
頁面之間的鏈接
頁面之間是通過JavaScript來??的次泽,有以下兩種方法:
- 通過a標(biāo)簽個(gè)新建標(biāo)簽建立鏈接
<a href="www.juejin.im/post/{hash}"></a>
這是從掘金首頁打開掘金文章的鏈接席爽,點(diǎn)擊該鏈接會(huì)打開新的頁面意荤,新頁面的window.opener的值就是指向掘金首頁的window。這樣可以說只锻,這兩個(gè)頁面是有鏈接的
- 通過window.open()打開新鏈接同理
在WhatWG規(guī)范中玖像,把這一類具有相互聯(lián)系關(guān)系的頁面稱為瀏覽器上下文組(browsing context group)
Chrome將瀏覽器上下文組中屬于同一站點(diǎn)的標(biāo)簽共用一個(gè)渲染進(jìn)程。