《WebKit技術(shù)內(nèi)幕》知識提煉 —— WebKit 架構(gòu)和模塊

image

WebKit 架構(gòu)及模塊

特征:支持不同瀏覽器臊泌,一部分代碼共享妻怎,另外一部分不同箫锤,不同部分稱為 WebKit 的移植(Ports)逛钻,如下圖中虛線框表示不同瀏覽器中實現(xiàn)普遍不同僚焦。

image
  • 最底層是操作系統(tǒng),WebKit 可以在不同的操作系統(tǒng)上工作
  • 操作系統(tǒng)之上的就是 WebKit 依賴的第三方庫曙痘,這些庫是 WebKit 運(yùn)行的基礎(chǔ)
  • 再往上一層就是 WebKit 項目了芳悲,圖中又將其分為兩層
    • WebCore 部分包含了目前被各個瀏覽器所使用的共享部分,是加工渲染網(wǎng)頁的基礎(chǔ)边坤。包括 HTML(解釋器)名扛、CSS(解釋器)、SVG茧痒、DOM肮韧、渲染樹(ReaderObject 樹、ReaderLayer 樹等)旺订、 Inspector(Web Inspector 開發(fā)者工具弄企、調(diào)試網(wǎng)頁)
    • JavaScriptCore 引擎是 WebKit 中的默認(rèn) JavaScript 引擎,WebKit 中對 JavaScript 引擎的調(diào)用是獨(dú)立引擎的区拳。例如 Chromium 中替換為 V8 引擎
    • WebKit Ports 指的是 WebKit 中的非共享部分拘领,包括硬件加速架構(gòu)、網(wǎng)絡(luò)棧劳闹、視頻解碼院究、圖片解碼等
  • WebCoreWebKit Ports 之上的層主要提供嵌入式編程接口,提供給瀏覽器調(diào)用本涕。接口層的定義也與移植密切相關(guān),而不是 WebKit 有一個統(tǒng)一接口伙窃。

WebKit2 嵌入式接口不是 WebKit 嵌入式接口的簡單修改菩颖,而是為了瀏覽環(huán)境的安全性和穩(wěn)定性原因考慮而引入了跨進(jìn)程的架構(gòu)。由蘋果于 2010 年 4 月發(fā)布为障,WebKet2 的進(jìn)程結(jié)構(gòu)模型中至少有兩個進(jìn)程晦闰,其一是 WebKit2 所在的瀏覽器或者 Web 平臺的 UI 進(jìn)程放祟,其二是 Web 進(jìn)程,也就是網(wǎng)頁渲染所在的進(jìn)程

基于 Blink 的 Chromium 瀏覽器結(jié)構(gòu)

Chromium 瀏覽器的架構(gòu)及模塊

Chromium 也是基于 WebKit(Blink)的呻右,并且將很多先進(jìn)的理念引入到瀏覽器中領(lǐng)域跪妥,可以了解如何基于 WebKit 構(gòu)建瀏覽器。

架構(gòu)及模塊

Chromium 的架構(gòu)和主要模塊如下:

image

從圖中可以看到声滥,Blink 只是其中的一塊眉撵,還有眾多的 Chromium 模塊,包括 GPU/CommandBuffer (硬件加速架構(gòu))落塑、V8 JavaScript 引擎纽疟、沙箱模型、CC(Chromium Compositor | Chromium 合成器)憾赁、IPC(進(jìn)程間通信)污朽、NPAPI(Netscape Plugin API)、UI 等

再向上就是 “Content 模塊” 和 “Content API(接口)”龙考,他們是 Chromium 對渲染網(wǎng)頁功能的抽象蟆肆。沙箱模型、跨進(jìn)程的 GPU 硬件加速機(jī)制晦款、眾多的 HTML5 功能都是在 Content 層里實現(xiàn)颓芭,將渲染機(jī)制、安全機(jī)制和插件機(jī)制隱藏起來柬赐,提供一個接口供上層模塊使用亡问。

多進(jìn)程模型

好處:

  • 避免因單個頁面的不響應(yīng)或者崩潰而影響整個瀏覽器的穩(wěn)定性
  • 當(dāng)?shù)谌讲寮罎r不會影響頁面或者瀏覽器的穩(wěn)定性
  • 方便了安全模型的實施,沙箱模型是基于多進(jìn)程架構(gòu)的

Chromium 瀏覽器中主要包含的進(jìn)程類型

  • Browser 進(jìn)程:瀏覽器主進(jìn)程肛宋,僅有一個
  • Renderer 進(jìn)程:渲染進(jìn)程州藕,負(fù)責(zé)頁面渲染,可能有多個酝陈,但不一定同打開的網(wǎng)頁數(shù)量一致
  • NPAPI 插件:為 NPAPI 類型的插件創(chuàng)建床玻,每種類型插件創(chuàng)建一次,僅當(dāng)使用時才創(chuàng)建沉帮,多個網(wǎng)頁中共享一個進(jìn)程但有不同的實例锈死。
  • GPU 進(jìn)程:僅當(dāng) GPU 硬件加速打開時才會被創(chuàng)建
  • PPAPI 進(jìn)程:Pepper 插件創(chuàng)建的進(jìn)程
  • 其他類型進(jìn)程:Linux 下的“Zygote”進(jìn)程,Renderer 進(jìn)程由它創(chuàng)建穆壕〈#“Sandbox”準(zhǔn)備進(jìn)程

Android 版不支持插件,GPU 進(jìn)程變成 Browser 進(jìn)程的一個線程喇勋,Renderer進(jìn)程會演變?yōu)?Android 上的服務(wù)(service)進(jìn)程缨该。并且有“影子”標(biāo)簽,會將后臺的網(wǎng)頁所使用的渲染設(shè)施都清除川背,當(dāng)用戶切換的時候需要重新加載渲染贰拿。

Renderer 進(jìn)程被創(chuàng)建的方式:

  • Process-per-site-instance:每個頁面都有獨(dú)立的 Render 進(jìn)程
  • Process-per-site:同一個域的頁面共享同一個進(jìn)程
  • Process-per-tab:(默認(rèn))每個標(biāo)簽頁
  • Single process:所有渲染工作都在 Browser 進(jìn)程中進(jìn)行蛤袒,Android WebView 中使用
Browser 進(jìn)程和 Renderer 進(jìn)程

因為 Chromium 中的一些類型和 WebKit 內(nèi)部不一致,所以 Chromium 沒有直接使用 WebKit 的接口而是用粘附層進(jìn)行了橋接。并在橋接層之上添加了用于進(jìn)程間通信的 Renderer,將渲染封裝成為單獨(dú)的服務(wù)灯萍,屏蔽具體實現(xiàn)。

Browser 進(jìn)程中也需要 RendererHost 來負(fù)責(zé)進(jìn)程通信珍德,再向上就是 Web Contents,也就是一個一個的標(biāo)簽頁和上層的瀏覽器UI

image
多線程模型

每個進(jìn)程內(nèi)都有很多線程健蕊,保證 Browser 進(jìn)程中的 UI 線程不會被任何其他費(fèi)時操作影響菱阵。Renderer 進(jìn)程中,不讓其他操作阻止渲染線程的快速執(zhí)行缩功。并且將渲染過程管線化晴及,讓渲染可以在不同的線程執(zhí)行(渲染過程分為很多獨(dú)立階段,每個階段創(chuàng)建一個線程嫡锌,利用CPU多核能力加快渲染虑稼,像流水線一樣提高并發(fā))

網(wǎng)頁加載渲染過程

  • Browser 進(jìn)程收到用戶請求,先 UI 線程處理势木,轉(zhuǎn)發(fā)給 IO 線程蛛倦,然后傳遞給 Renderer 進(jìn)程
  • Renderer 進(jìn)程有自己的 IO 線程,經(jīng)過簡單的解釋后交給渲染進(jìn)程渲染啦桌,渲染過程可能需要 Browser 進(jìn)程獲取資源溯壶,GPU 進(jìn)程幫助渲染。渲染結(jié)果由 IO 線程傳遞給 Browser 進(jìn)程
  • Browser 進(jìn)程繪制

進(jìn)程間通信:絕大多數(shù)場景使用事件和 Chromium 新創(chuàng)建的任務(wù)傳遞機(jī)制甫男,僅在非用不可的情況下使用鎖或線程安全對象且改。

Content 接口

Content 接口不僅對多進(jìn)程渲染提供一層封裝,并且支持所有 HTML5 功能板驳,GPU 硬件加速功能又跛,沙箱機(jī)制。

WebKit2

WebKit2 是一套權(quán)限的結(jié)構(gòu)和接口若治,目的同 Chromium 類似慨蓝,將渲染過程放在單獨(dú)進(jìn)程中完成。

比較 WebKit2 和 Chromium

  • Chromium 使用 WebKit 接口端幼,而不是 WebKit2
  • Chromium 是將渲染封裝成為服務(wù)礼烈,在服務(wù)的基礎(chǔ)上構(gòu)建多進(jìn)程。而 WebKit2 希望將多進(jìn)程結(jié)構(gòu)隱藏起來静暂,直接在渲染中實現(xiàn)多進(jìn)程模型济丘。

更多

《WebKit技術(shù)內(nèi)幕》知識提煉 —— 資源加載和網(wǎng)絡(luò)棧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洽蛀,隨后出現(xiàn)的幾起案子摹迷,更是在濱河造成了極大的恐慌,老刑警劉巖郊供,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡碉,死亡現(xiàn)場離奇詭異,居然都是意外死亡驮审,警方通過查閱死者的電腦和手機(jī)鲫寄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疯淫,“玉大人地来,你說我怎么就攤上這事∥醪簦” “怎么了未斑?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長币绩。 經(jīng)常有香客問我蜡秽,道長,這世上最難降的妖魔是什么缆镣? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任芽突,我火速辦了婚禮,結(jié)果婚禮上董瞻,老公的妹妹穿的比我還像新娘寞蚌。我一直安慰自己,他們只是感情好钠糊,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布挟秤。 她就那樣靜靜地躺著,像睡著了一般眠蚂。 火紅的嫁衣襯著肌膚如雪煞聪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天逝慧,我揣著相機(jī)與錄音昔脯,去河邊找鬼。 笑死笛臣,一個胖子當(dāng)著我的面吹牛云稚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沈堡,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼静陈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲸拥,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拐格,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刑赶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏浊,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年撞叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了金踪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牵敷,死狀恐怖胡岔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枷餐,我是刑警寧澤靶瘸,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尖淘,受9級特大地震影響奕锌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜村生,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一惊暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁桃,春花似錦辽话、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟀苛,卻和暖如春益咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帜平。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工幽告, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裆甩。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓冗锁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗤栓。 傳聞我的和親對象是個殘疾皇子冻河,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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