不學(xué)無術(shù),在任何時(shí)候,對任何人,都無所幫助,也不會(huì)帶來利益静尼“追郏——馬克思
瀏覽器架構(gòu)
事實(shí)上開發(fā)一個(gè)瀏覽器可以是單進(jìn)程多線程應(yīng)用,也可以是通過IPC進(jìn)行通信的多進(jìn)程應(yīng)用鼠渺。
一般來說一個(gè)好的應(yīng)用程序往往被分割為多個(gè)相互獨(dú)立的模塊進(jìn)程鸭巴,每個(gè)進(jìn)程都有自己的核心職責(zé)。這些進(jìn)程相互配合完成瀏覽器的整體功能拦盹。而每個(gè)進(jìn)程又可以包含多個(gè)線程鹃祖,一個(gè)進(jìn)程中的多個(gè)線程相互協(xié)同工作完成所在進(jìn)程的職責(zé)。
不同瀏覽器采用了不同的架構(gòu)模式普舆,這里并不存在標(biāo)準(zhǔn)恬口。
補(bǔ)充說明進(jìn)程和線程的區(qū)別如下圖
下邊我們以chrome瀏覽器為例來看看它的架構(gòu)
?○ Browser Process 核心職責(zé):
1:負(fù)責(zé)地址欄、書簽欄沼侣、前進(jìn)后退按鈕等部分工作祖能。
2:負(fù)責(zé)瀏覽器不可見的一些底層操作,如網(wǎng)絡(luò)請求蛾洛、文件訪問等养铸。
?○ Render Process 核心職責(zé):
負(fù)責(zé)網(wǎng)頁呈現(xiàn)渲染
?○ Plugin Process 核心職責(zé):
負(fù)責(zé)一個(gè)網(wǎng)頁所用到的所有插件,如flash等轧膘。
?○ GPU Process 核心職責(zé):
負(fù)責(zé)GPU(Graphics Processing Unit)相關(guān)任務(wù)钞螟,即圖像處理計(jì)算相關(guān)任務(wù)。
Chrome還為我們提供了任務(wù)管理器谎碍,方便我們查看當(dāng)前瀏覽器中運(yùn)行的所有進(jìn)程以及每個(gè)進(jìn)程占用的系統(tǒng)資源等更多信息鳞滨。
Chrome瀏覽器多進(jìn)程架構(gòu)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1:某一渲染進(jìn)程出現(xiàn)問題不會(huì)影響其他進(jìn)程。
2:在系統(tǒng)層面限定了不同的進(jìn)程權(quán)限蟆淀,更為安全拯啦。
缺點(diǎn):
1:不同進(jìn)程的內(nèi)存是不能共享的,這就意味著不同進(jìn)程包含相同的內(nèi)容扳碍。
2:為了節(jié)省內(nèi)存提岔,chrome限定了最大進(jìn)程數(shù),當(dāng)達(dá)到這一極限時(shí)笋敞,新開的Tab會(huì)共享之前打開的同一站點(diǎn)的渲染進(jìn)程碱蒙。(最大進(jìn)程數(shù)由設(shè)備的內(nèi)存和CPU決定)
Site Isolation
Site Isolation 被大家看做是里程碑式的功能,其成功的實(shí)現(xiàn)是多年工程努力的結(jié)果。
那么到底什么是Site Isolation呢赛惩?
從上邊的Chrome多進(jìn)程架構(gòu)圖中我們可以看到某些進(jìn)程中還出現(xiàn)了SubFrame哀墓,這就是Site Isolation機(jī)制作用的結(jié)果。
Site Isolation 機(jī)制從Chrome 67開始默認(rèn)啟用喷兼。這種機(jī)制允許在同一個(gè)Tab下的跨站iframe使用單獨(dú)的進(jìn)程來渲染篮绰,這樣會(huì)更為安全。
Site Isolation并不是簡單的進(jìn)程疊加季惯,而是在底層改變了iframe的通信方法吠各,Chrome的其他功能也要做對應(yīng)的調(diào)整,比如devtool需要響應(yīng)的支持勉抓。
輸入U(xiǎn)RL后瀏覽器都干了些什么贾漏?
前言:
如上邊說的,我們都知道chrome是多進(jìn)程的藕筋,不同的進(jìn)程有不同的核心職責(zé)纵散。
Browser Process掌管著Tab外的工作,如任務(wù)欄隐圾、書簽欄等
那么很明顯我們在瀏覽器任務(wù)欄中輸入了URL后伍掀,立馬工作的就是Browser Process。
Browser Process 又對這些工作進(jìn)行一一拆解暇藏,交給不同的線程去處理蜜笤。
Browser Process下的線程:
1:UI Thread? 控制瀏覽器上的按鈕和輸入框
2:Network Thread? 處理網(wǎng)絡(luò)請求
3:Storage Thread? 控制文件等的訪問
輸入U(xiǎn)RL后Chrome瀏覽器具體干了些什么?
1:輸入處理
UI Thread 處理輸入叨咖,判斷用戶輸入的URL還是query瘩例,通知Network Thread獲取網(wǎng)頁內(nèi)容。
2:開始導(dǎo)航
Network Thread 負(fù)責(zé)網(wǎng)絡(luò)請求網(wǎng)頁內(nèi)容甸各,并控制 tab 上的 spinner 展現(xiàn)垛贤,表示正在加載中。執(zhí)行 DNS 查詢趣倾,隨后為請求建立 TLS 連接聘惦。如果 Network Thread 接收到了重定向請求頭如 301,Network Thread 會(huì)通知 UI Thread?服務(wù)器要求重定向儒恋。之后善绎,另外一個(gè) URL 請求會(huì)被觸發(fā)。
3:讀取響應(yīng)
Network Thread?會(huì)依據(jù) Content-Type 及 MIME Type sniffing 判斷響應(yīng)內(nèi)容的格式诫尽。如果響應(yīng)內(nèi)容的格式是 HTML ,下一步將會(huì)把這些數(shù)據(jù)傳遞給 Renderer Process牧嫉,如果是 zip 文件或者其它文件剂跟,會(huì)把相關(guān)數(shù)據(jù)傳輸給下載管理器减途。
Safe Browsing 檢查也會(huì)在此時(shí)觸發(fā)曹洽,如果域名或者請求內(nèi)容匹配到已知的惡意站點(diǎn)鳍置,Network Thread 會(huì)展示一個(gè)警告頁税产。此外 CORB 檢測也會(huì)觸發(fā)確保敏感數(shù)據(jù)不會(huì)被傳遞給渲染進(jìn)程。
4:查找渲染進(jìn)程
當(dāng)上述所有檢查完成梧兼,Network Thread 確信瀏覽器可以導(dǎo)航到請求網(wǎng)頁,Network Thread 會(huì)通知 UI Thread 數(shù)據(jù)已經(jīng)準(zhǔn)備好智听,UI Thread 會(huì)查找到一個(gè) Renderer Process 進(jìn)行網(wǎng)頁的渲染到推。為什么會(huì)是查找一個(gè)Render Process,這個(gè)涉及到一個(gè)加速方案惕澎,當(dāng)UI Thread通知Network Thread進(jìn)行網(wǎng)絡(luò)請求的時(shí)候莉测,UI Thread事實(shí)上清楚將要導(dǎo)航到哪個(gè)站點(diǎn),所以UI Thread會(huì)在此時(shí)并行預(yù)先加載一個(gè)渲染進(jìn)程唧喉,等到Network Thread請求到數(shù)據(jù)時(shí)捣卤,渲染進(jìn)程就已經(jīng)準(zhǔn)備好了。但是如果是重定向八孝,那么之前預(yù)先準(zhǔn)備的渲染進(jìn)程將不可用董朝,就要重新再啟一個(gè)渲染進(jìn)程。
5:確認(rèn)導(dǎo)航
上述過程后干跛,數(shù)據(jù)以及渲染進(jìn)程都是可用了子姜,Browser Process會(huì)給Render Process發(fā)送IPC消息來確認(rèn)導(dǎo)航,一旦Browser Process收到Render Process的渲染確認(rèn)信息楼入,導(dǎo)航過程就結(jié)束了哥捕,頁面加載過程開始。 此時(shí)嘉熊,地址欄會(huì)更新遥赚,展示出新頁面的網(wǎng)頁信息。history tab會(huì)更新阐肤,可通過返回鍵返回導(dǎo)航來的頁面凫佛,為了讓關(guān)閉tab窗口后便于恢復(fù),這些信息會(huì)保存在硬盤中。
未完待續(xù)...