瀏覽器的工作原理

一磨淌、基本概念:

瀏覽器是多進(jìn)程的
瀏覽器之所以能夠運(yùn)行疲憋,是因?yàn)橄到y(tǒng)給它的進(jìn)程分配了資源(cpu、內(nèi)存)
簡單點(diǎn)理解伦糯,每打開一個(gè)Tab頁柜某,就相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立的瀏覽器進(jìn)程。

二敛纲、瀏覽器都包含哪些進(jìn)程喂击?

1. Browser進(jìn)程:瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào)、主控)淤翔,只有一個(gè)翰绊。作用有
負(fù)責(zé)瀏覽器界面顯示,與用戶交互旁壮。如前進(jìn)监嗜,后退等
負(fù)責(zé)各個(gè)頁面的管理,創(chuàng)建和銷毀其他進(jìn)程
將Renderer進(jìn)程得到的內(nèi)存中的Bitmap抡谐,繪制到用戶界面上
網(wǎng)絡(luò)資源的管理裁奇,下載等
2. 第三方插件進(jìn)程:每種類型的插件對應(yīng)一個(gè)進(jìn)程,僅當(dāng)使用該插件時(shí)才創(chuàng)建
3. GPU進(jìn)程:最多一個(gè)麦撵,用于3D繪制等
4. 瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核)(Renderer進(jìn)程刽肠,內(nèi)部是多線程的):默認(rèn)每個(gè)Tab頁面一個(gè)進(jìn)
程,互不影響免胃。主要作用是頁面渲染音五,腳本執(zhí)行,事件處理等

三羔沙、瀏覽器多進(jìn)程的優(yōu)勢有哪些躺涝?

相比于單進(jìn)程瀏覽器,多進(jìn)程有如下優(yōu)點(diǎn):
避免單個(gè)page crash影響整個(gè)瀏覽器
避免第三方插件crash影響整個(gè)瀏覽器
多進(jìn)程充分利用多核優(yōu)勢
方便使用沙盒模型隔離插件等進(jìn)程扼雏,提高瀏覽器穩(wěn)定性

四坚嗜、瀏覽器內(nèi)核(渲染進(jìn)程)

頁面的渲染夯膀,JS的執(zhí)行,事件的循環(huán)惶傻,都在這個(gè)進(jìn)程內(nèi)進(jìn)行棍郎,瀏覽器的渲染進(jìn)程是多線程的
1. GUI渲染線程
負(fù)責(zé)渲染瀏覽器界面,解析HTML银室,CSS,構(gòu)建DOM樹和RenderObject樹励翼,布局和繪制等蜈敢。
當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線程就會(huì)執(zhí)行
注意汽抚,GUI渲染線程與JS引擎線程是互斥的抓狭,當(dāng)JS引擎執(zhí)行時(shí)GUI線程會(huì)被掛起(相當(dāng)于被凍
結(jié)了),GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎空閑時(shí)立即被執(zhí)行造烁。
2. JS引擎線程
也稱為JS內(nèi)核否过,負(fù)責(zé)處理Javascript腳本程序。(例如V8引擎)
JS引擎線程負(fù)責(zé)解析Javascript腳本惭蟋,運(yùn)行代碼苗桂。
JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來,然后加以處理告组,一個(gè)Tab頁(renderer進(jìn)程)中無
論什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序煤伟。
同樣注意,GUI渲染線程與JS引擎線程是互斥的木缝,所以如果JS執(zhí)行的時(shí)間過長便锨,這樣就會(huì)造成
頁面的渲染不連貫,導(dǎo)致頁面渲染加載阻塞我碟。
3. 事件觸發(fā)線程
歸屬于瀏覽器而不是JS引擎放案,用來控制事件循環(huán)(可以理解,JS引擎自己都忙不過來矫俺,需要瀏
覽器另開線程協(xié)助)
當(dāng)JS引擎執(zhí)行代碼塊如setTimeOut時(shí)(也可來自瀏覽器內(nèi)核的其他線程,如鼠標(biāo)點(diǎn)擊吱殉、AJAX
異步請求等),會(huì)將對應(yīng)任務(wù)添加到事件線程中
當(dāng)對應(yīng)的事件符合觸發(fā)條件被觸發(fā)時(shí)恳守,該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾考婴,等待JS引
擎的處理
注意,由于JS的單線程關(guān)系催烘,所以這些待處理隊(duì)列中的事件都得排隊(duì)等待JS引擎處理(當(dāng)JS引
擎空閑時(shí)才會(huì)去執(zhí)行)
4. 定時(shí)觸發(fā)器線程
傳說中的 setInterval 與 setTimeout 所在線程
瀏覽器定時(shí)計(jì)數(shù)器并不是由JavaScript引擎計(jì)數(shù)的,(因?yàn)镴avaScript引擎是單線程的, 如果處
于阻塞線程狀態(tài)就會(huì)影響記計(jì)時(shí)的準(zhǔn)確)
通過單獨(dú)線程來計(jì)時(shí)并觸發(fā)定時(shí)(計(jì)時(shí)完畢后沥阱,添加到事件隊(duì)列中,等待JS引擎空閑后執(zhí)
行)
注意伊群,W3C在HTML標(biāo)準(zhǔn)中規(guī)定考杉,規(guī)定要求setTimeout中低于4ms的時(shí)間間隔算為4ms策精。 5. 異步http請求線程
XMLHttpRequest在連接后是通過瀏覽器新開一個(gè)線程請求
將檢測到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù)崇棠,異步線程就產(chǎn)生狀態(tài)變更事件咽袜,將這個(gè)回調(diào)再
放入事件隊(duì)列中。再由JavaScript引擎執(zhí)行枕稀。

五询刹、Browser進(jìn)程和瀏覽器內(nèi)核(Renderer進(jìn)程)的通信過程

Browser進(jìn)程收到用戶請求,首先需要獲取頁面內(nèi)容(譬如通過網(wǎng)絡(luò)下載資源)萎坷,隨后將該任務(wù)通
過RendererHost接口傳遞給Render進(jìn)程
Renderer進(jìn)程的RendererHost接口收到消息凹联,簡單解釋后,交給渲染線程哆档,然后開始渲染
渲染線程接收請求蔽挠,加載網(wǎng)頁并渲染網(wǎng)頁,這其中可能需要Browser進(jìn)程獲取資源和需要
GPU進(jìn)程來幫助渲染
當(dāng)然可能會(huì)有JS線程操作DOM(這樣可能會(huì)造成回流并重繪)
最后Render進(jìn)程將結(jié)果傳遞給Browser進(jìn)程
Browser進(jìn)程接收到結(jié)果并將結(jié)果繪制出

六瓜浸、理瀏覽器內(nèi)核中線程之間的關(guān)系

1.GUI渲染線程與JS引擎線程互斥
由于JavaScript是可操縱DOM的澳淑,如果在修改這些元素屬性同時(shí)渲染界面(即JS線程和UI線程同時(shí)運(yùn)
行),那么渲染線程前后獲得的元素?cái)?shù)據(jù)就可能不一致了插佛。
因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果杠巡,瀏覽器設(shè)置GUI渲染線程與JS引擎為互斥的關(guān)系,當(dāng)JS引擎執(zhí)
行時(shí)GUI線程會(huì)被掛起朗涩, GUI更新則會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎線程空閑時(shí)立即被執(zhí)行忽孽。
2.JS阻塞頁面加載
從上述的互斥關(guān)系,可以推導(dǎo)出谢床,JS如果執(zhí)行時(shí)間過長就會(huì)阻塞頁面兄一。
譬如,假設(shè)JS引擎正在進(jìn)行巨量的計(jì)算识腿,此時(shí)就算GUI有更新出革,也會(huì)被保存到隊(duì)列中,等待JS引擎空閑
后執(zhí)行渡讼。 然后骂束,由于巨量計(jì)算,所以JS引擎很可能很久很久后才能空閑成箫,自然會(huì)感覺到巨卡無比展箱。
所以,要盡量避免JS執(zhí)行時(shí)間過長蹬昌,這樣就會(huì)造成頁面的渲染不連貫混驰,導(dǎo)致頁面渲染加載阻塞的感覺。

參考文章:https://juejin.cn/post/6844903569200513037

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栖榨,隨后出現(xiàn)的幾起案子昆汹,更是在濱河造成了極大的恐慌,老刑警劉巖婴栽,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件满粗,死亡現(xiàn)場離奇詭異,居然都是意外死亡愚争,警方通過查閱死者的電腦和手機(jī)映皆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轰枝,“玉大人劫扒,你說我怎么就攤上這事±旮啵” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵添怔,是天一觀的道長湾戳。 經(jīng)常有香客問我,道長广料,這世上最難降的妖魔是什么砾脑? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮艾杏,結(jié)果婚禮上韧衣,老公的妹妹穿的比我還像新娘。我一直安慰自己购桑,他們只是感情好畅铭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勃蜘,像睡著了一般硕噩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缭贡,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天炉擅,我揣著相機(jī)與錄音,去河邊找鬼阳惹。 笑死谍失,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莹汤。 我是一名探鬼主播快鱼,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攒巍?” 一聲冷哼從身側(cè)響起嗽仪,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柒莉,沒想到半個(gè)月后闻坚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兢孝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年窿凤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨蟹。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雳殊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窗轩,到底是詐尸還是另有隱情夯秃,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布痢艺,位于F島的核電站仓洼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堤舒。R本人自食惡果不足惜色建,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舌缤。 院中可真熱鬧箕戳,春花似錦、人聲如沸国撵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卸留。三九已至走越,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耻瑟,已是汗流浹背旨指。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喳整,地道東北人谆构。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像框都,于是被迫代替她去往敵國和親搬素。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容