參考文章:
1.進(jìn)程和線(xiàn)程
進(jìn)程就像是一個(gè)有邊界的生產(chǎn)廠間,而線(xiàn)程就像是廠間內(nèi)的一個(gè)個(gè)員工,可以自己做自己的事情,也可以相互配合做同一件事情。
當(dāng)我們啟動(dòng)一個(gè)應(yīng)用,計(jì)算機(jī)會(huì)創(chuàng)建一個(gè)進(jìn)程,操作系統(tǒng)會(huì)為進(jìn)程分配一部分內(nèi)存,應(yīng)用的所有狀態(tài)都會(huì)保存在這塊內(nèi)存中,應(yīng)用也許還會(huì)創(chuàng)建多個(gè)線(xiàn)程來(lái)輔助工作,這些線(xiàn)程可以共享這部分內(nèi)存中的數(shù)據(jù)。如果應(yīng)用關(guān)閉,進(jìn)程會(huì)被終結(jié),操作系統(tǒng)會(huì)釋放相關(guān)內(nèi)存。
一個(gè)進(jìn)程還可以要求操作系統(tǒng)生成另一個(gè)進(jìn)程來(lái)執(zhí)行不同的任務(wù),系統(tǒng)會(huì)為新的進(jìn)程分配獨(dú)立的內(nèi)存,兩個(gè)進(jìn)程之間可以使用 IPC (Inter )進(jìn)行通信。很多應(yīng)用都會(huì)采用這樣的設(shè)計(jì),如果一個(gè)工作進(jìn)程反應(yīng)遲鈍,重啟這個(gè)進(jìn)程不會(huì)影響應(yīng)用其它進(jìn)程的工作。
關(guān)于進(jìn)程和線(xiàn)程可以參考:
2.瀏覽器的架構(gòu)
其實(shí)如果要開(kāi)發(fā)一個(gè)瀏覽器,它可以是單進(jìn)程多線(xiàn)程的應(yīng)用,也可以是使用 IPC 通信的多進(jìn)程應(yīng)用。
不同瀏覽器的架構(gòu)模型:
本文以 為例進(jìn)行說(shuō)明 :
采用多進(jìn)程架構(gòu),其頂層存在一個(gè) 用以協(xié)調(diào)瀏覽器的其它進(jìn)程。
具體來(lái)說(shuō),地主要進(jìn)程及職責(zé)如下:
GPU
還為我們提供了「任務(wù)管理器」,供我們方便的查看當(dāng)前瀏覽器中運(yùn)行的所有進(jìn)程及每個(gè)進(jìn)程占用的系統(tǒng)資源,右鍵單擊還可以查看更多類(lèi)別信息。
3.多進(jìn)程架構(gòu)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.某一渲染進(jìn)程出問(wèn)題不會(huì)影響其他進(jìn)程
2.更為安全,在系統(tǒng)層面上限定了不同進(jìn)程的權(quán)限
缺點(diǎn):
由于不同進(jìn)程間的內(nèi)存不共享,不同進(jìn)程的內(nèi)存常常需要包含相同的內(nèi)容。
為了節(jié)省內(nèi)存,限制了最多的進(jìn)程數(shù)瀏覽器工作原理是怎樣的,最大進(jìn)程數(shù)量由設(shè)備的內(nèi)存和 CPU 能力決定,當(dāng)達(dá)到這一限制時(shí),新打開(kāi)的 Tab 會(huì)共用之前同一個(gè)站點(diǎn)的渲染進(jìn)程。
把瀏覽器不同程序的功能看做服務(wù),這些服務(wù)可以方便的分割為不同的進(jìn)程或者合并為一個(gè)進(jìn)程。以 為例,如果 運(yùn)行在強(qiáng)大的硬件上,它會(huì)分割不同的服務(wù)到不同的進(jìn)程,這樣 整體的運(yùn)行會(huì)更加穩(wěn)定,但是如果 運(yùn)行在資源貧瘠的設(shè)備上,這些服務(wù)又會(huì)合并到同一個(gè)進(jìn)程中運(yùn)行,這樣可以節(jié)省內(nèi)存。
的渲染——Site
在上面的進(jìn)程圖中我們還可以看到一些進(jìn)程下還存在著 ,這就是 Site 機(jī)制作用的結(jié)果。
Site 機(jī)制從 67 開(kāi)始默認(rèn)啟用。這種機(jī)制允許在同一個(gè) Tab 下的跨站 使用單獨(dú)的進(jìn)程來(lái)渲染,這樣會(huì)更為安全。
Site 被大家看做里程碑式的功能, 其成功實(shí)現(xiàn)是多年工程努力的結(jié)果。Site 不是簡(jiǎn)單的疊加多個(gè)進(jìn)程。這種機(jī)制在底層改變了 之間通信的方法, 的其它功能都需要做對(duì)應(yīng)的調(diào)整,比如說(shuō) 需要相應(yīng)的支持,甚至 Ctrl + F 也需要支持。
關(guān)于 Site 的更多內(nèi)容可參考下述鏈接:
4.導(dǎo)航過(guò)程發(fā)生了什么
也許大多數(shù)人使用 最多的場(chǎng)景就是在地址欄輸入關(guān)鍵字進(jìn)行搜索或者輸入地址導(dǎo)航到某個(gè)網(wǎng)站,我們來(lái)看看瀏覽器是怎么看待這個(gè)過(guò)程的。
我們知道瀏覽器 Tab 外的工作主要由 掌控, 又對(duì)這些工作進(jìn)一步劃分,使用不同線(xiàn)程進(jìn)行處理:
瀏覽器主進(jìn)程中不同的線(xiàn)程:
回到我們的問(wèn)題,當(dāng)我們?cè)跒g覽器地址欄中輸入文字,并點(diǎn)擊回車(chē)獲得頁(yè)面內(nèi)容的過(guò)程在瀏覽器看來(lái)可以分為以下幾步:
1.處理輸入
UI 需要判斷用戶(hù)輸入的是 URL 還是 query;
2.開(kāi)始導(dǎo)航
當(dāng)用戶(hù)點(diǎn)擊回車(chē)鍵,UI 通知 獲取網(wǎng)頁(yè)內(nèi)容,并控制 tab 上的 展現(xiàn),表示正在加載中。
會(huì)執(zhí)行 DNS 查詢(xún),隨后為請(qǐng)求建立 TLS 連接。
UI 通知 加載相關(guān)信息:
如果 接收到了重定向請(qǐng)求頭如 301, 會(huì)通知 UI 服務(wù)器要求重定向,之后,另外一個(gè) URL 請(qǐng)求會(huì)被觸發(fā)。
3.讀取響應(yīng)
當(dāng)請(qǐng)求響應(yīng)返回的時(shí)候瀏覽器工作原理是怎樣的, 會(huì)依據(jù) -Type 及 MIME Type 判斷響應(yīng)內(nèi)容的格式。
如果響應(yīng)內(nèi)容的格式是 HTML ,下一步將會(huì)把這些數(shù)據(jù)傳遞給 ,如果是 zip 文件或者其它文件,會(huì)把相關(guān)數(shù)據(jù)傳輸給下載管理器。
Safe 檢查也會(huì)在此時(shí)觸發(fā),如果域名或者請(qǐng)求內(nèi)容匹配到已知的惡意站點(diǎn), 會(huì)展示一個(gè)警告頁(yè)。此外 CORB 檢測(cè)也會(huì)觸發(fā)確保敏感數(shù)據(jù)不會(huì)被傳遞給渲染進(jìn)程。
Safe :
CORB:+////.md
4.查找渲染進(jìn)程
當(dāng)上述所有檢查完成, 確信瀏覽器可以導(dǎo)航到請(qǐng)求網(wǎng)頁(yè), 會(huì)通知 UI 數(shù)據(jù)已經(jīng)準(zhǔn)備好,UI 會(huì)查找到一個(gè) 進(jìn)行網(wǎng)頁(yè)的渲染。
收到 返回的數(shù)據(jù)后,UI 查找相關(guān)的渲染進(jìn)程:
由于網(wǎng)絡(luò)請(qǐng)求獲取響應(yīng)需要時(shí)間,這里其實(shí)還存在著一個(gè)加速方案。當(dāng) UI 發(fā)送 URL 請(qǐng)求給 時(shí),瀏覽器其實(shí)已經(jīng)知道了將要導(dǎo)航到那個(gè)站點(diǎn)。UI 會(huì)并行的預(yù)先查找和啟動(dòng)一個(gè)渲染進(jìn)程,如果一切正常,當(dāng) 接收到數(shù)據(jù)時(shí),渲染進(jìn)程已經(jīng)準(zhǔn)備就緒了,但是如果遇到重定向,準(zhǔn)備好的渲染進(jìn)程也許就不可用了,這時(shí)候就需要重啟一個(gè)新的渲染進(jìn)程。
5.確認(rèn)導(dǎo)航
進(jìn)過(guò)了上述過(guò)程,數(shù)據(jù)以及渲染進(jìn)程都可用了, 會(huì)給 發(fā)送 IPC 消息來(lái)確認(rèn)導(dǎo)航,一旦 收到 的渲染確認(rèn)消息,導(dǎo)航過(guò)程結(jié)束,頁(yè)面加載過(guò)程開(kāi)始。
此時(shí),地址欄會(huì)更新,展示出新頁(yè)面的網(wǎng)頁(yè)信息。 tab 會(huì)更新,可通過(guò)返回鍵返回導(dǎo)航來(lái)的頁(yè)面,為了讓關(guān)閉 tab 或者窗口后便于恢復(fù),這些信息會(huì)存放在硬盤(pán)中。
和 通過(guò) IPC 通信,請(qǐng)求 渲染頁(yè)面:
6.額外的步驟
一旦導(dǎo)航被確認(rèn), 會(huì)使用相關(guān)的資源渲染頁(yè)面,下文中我們將重點(diǎn)介紹渲染流程。當(dāng) 渲染結(jié)束(渲染結(jié)束意味著該頁(yè)面內(nèi)的所有的頁(yè)面,包括所有 都觸發(fā)了 時(shí)),會(huì)發(fā)送 IPC 信號(hào)到 , UI 會(huì)停止展示 tab 中的 。
發(fā)送 IPC 消息通知 頁(yè)面已經(jīng)加載完成:
當(dāng)然上面的流程只是網(wǎng)頁(yè)首幀渲染完成,在此之后,客戶(hù)端依舊可下載額外的資源渲染出新的視圖。
在這里我們可以明確一點(diǎn),所有的 JS 代碼其實(shí)都由 控制的,所以在你瀏覽網(wǎng)頁(yè)內(nèi)容的過(guò)程大部分時(shí)候不會(huì)涉及到其它的進(jìn)程。不過(guò)也許你也曾經(jīng)監(jiān)聽(tīng)過(guò) 事件,這個(gè)事件再次涉及到 和 的交互,當(dāng)當(dāng)前頁(yè)面關(guān)閉時(shí)(關(guān)閉 Tab ,刷新等等), 需要通知 進(jìn)行相關(guān)的檢查,對(duì)相關(guān)事件進(jìn)行處理。
瀏覽器進(jìn)程發(fā)送 IPC 消息給渲染進(jìn)程,通知要離開(kāi)當(dāng)前網(wǎng)站了:
如果導(dǎo)航由 觸發(fā)(比如在用戶(hù)點(diǎn)擊某鏈接,或者JS執(zhí)行 . = "" ) 會(huì)首先檢查是否有 事件處理器,導(dǎo)航請(qǐng)求由 傳遞給
如果導(dǎo)航到新的網(wǎng)站,會(huì)啟用一個(gè)新的 來(lái)處理新頁(yè)面的渲染,老的進(jìn)程會(huì)留下來(lái)處理類(lèi)似 等事件。
關(guān)于頁(yè)面的生命周期,更多內(nèi)容可參考:
瀏覽器進(jìn)程發(fā)送 IPC 消息到新的渲染進(jìn)程通知渲染新的頁(yè)面,同時(shí)通知舊的渲染進(jìn)程卸載:
除了上述流程,有些頁(yè)面還擁有 (服務(wù)工作線(xiàn)程), 讓開(kāi)發(fā)者對(duì)本地緩存及判斷何時(shí)從網(wǎng)絡(luò)上獲取信息有了更多的控制權(quán),如果 被設(shè)置為從本地 cache 中加載數(shù)據(jù),那么就沒(méi)有必要從網(wǎng)上獲取更多數(shù)據(jù)了。
值得注意的是 也是運(yùn)行在渲染進(jìn)程中的 JS 代碼,因此對(duì)于擁有 的頁(yè)面,上述流程有些許的不同。
當(dāng)有 被注冊(cè)時(shí),其作用域會(huì)被保存,當(dāng)有導(dǎo)航時(shí), 會(huì)在注冊(cè)過(guò)的 的作用域中檢查相關(guān)域名,如果存在對(duì)應(yīng)的 ,UI 會(huì)找到一個(gè) 來(lái)處理相關(guān)代碼, 可能會(huì)從 cache 中加載數(shù)據(jù),從而終止對(duì)網(wǎng)絡(luò)的請(qǐng)求,也可能從網(wǎng)上請(qǐng)求新的數(shù)據(jù)。
依據(jù)具體情形做處理:
關(guān)于 的更多內(nèi)容可參考:
如果 最終決定通過(guò)網(wǎng)上獲取數(shù)據(jù), 進(jìn)程 和 進(jìn)程的交互其實(shí)會(huì)延后數(shù)據(jù)的請(qǐng)求時(shí)間 。 是一種與 并行的加速加載資源的機(jī)制,服務(wù)端通過(guò)請(qǐng)求頭可以識(shí)別這類(lèi)請(qǐng)求,而做出相應(yīng)的處理。
更多內(nèi)容可參考:
5.渲染進(jìn)程是如何工作的
渲染進(jìn)程幾乎負(fù)責(zé) Tab 內(nèi)的所有事情,渲染進(jìn)程的核心目的在于轉(zhuǎn)換 HTML CSS JS 為用戶(hù)可交互的 web 頁(yè)面。渲染進(jìn)程中主要包含以下線(xiàn)程:
1.主線(xiàn)程 Main
2.工作線(xiàn)程
3.排版線(xiàn)程
4.光柵線(xiàn)程
后文我們將逐步介紹不同線(xiàn)程的職責(zé),在此之前我們先看看渲染的流程:
1.構(gòu)建DOM
當(dāng)渲染進(jìn)程接收到導(dǎo)航的確認(rèn)信息,開(kāi)始接受 HTML 數(shù)據(jù)時(shí),主線(xiàn)程會(huì)解析文本字符串為 DOM。
渲染 html 為 DOM 的方法由HTML 定義。
HTML :
2.加載次級(jí)的資源
網(wǎng)頁(yè)中常常包含諸如圖片,CSS,JS 等額外的資源,這些資源需要從網(wǎng)絡(luò)上或者 cache 中獲取。主進(jìn)程可以在構(gòu)建 DOM 的過(guò)程中會(huì)逐一請(qǐng)求它們,為了加速 會(huì)同時(shí)運(yùn)行,如果在 html 中存在
等標(biāo)簽, 會(huì)把這些請(qǐng)求傳遞給 中的 進(jìn)行相關(guān)資源的下載。
3.JS的下載與執(zhí)行
當(dāng)遇到
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有