最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Chromium多進(jìn)程架構(gòu),你知道多少?

2023-06-27 14:58 作者:補給站Linux內(nèi)核  | 我要投稿

一、前言

國內(nèi)外主流的瀏覽器,大多采用的是谷歌的Chromium 瀏覽器內(nèi)核,Chromium是一個多進(jìn)程多線程架構(gòu)的Web引擎,很多應(yīng)用和底層開發(fā)者希望了解Chromium中的進(jìn)程和線程的種類和用途,以便能利用相關(guān)信息提升應(yīng)用的性能。為此,本文介紹了Chromium的多進(jìn)程架構(gòu)演進(jìn)歷史,并詳細(xì)列舉了Chromium有哪些常見的進(jìn)程和線程,并詳細(xì)說明了它們的用途。希望通過此文能幫助讀者初步了解Chromium有哪些常見的進(jìn)程和線程,并詳細(xì)說明了它們的用途。希望通過此文能幫助讀者初步了解Chromium/Webview運行時的進(jìn)程和線程情況。


二、Chromium進(jìn)程架構(gòu)演進(jìn)史

單進(jìn)程架構(gòu)


2007年前,市場上的瀏覽器基本上都是單進(jìn)程架構(gòu),所有的功能模塊都是運行在同一進(jìn)程中。單一進(jìn)程的架構(gòu)有以下幾個問題:


1.?穩(wěn)定性

單進(jìn)程的瀏覽器中,任一模塊出現(xiàn)問題都會導(dǎo)致整個瀏覽器的崩潰。特別是早期瀏覽器的很多功能需要通過插件來實現(xiàn),而三方實現(xiàn)的插件又特別容易出問題。類似的,過于復(fù)雜或者性能低下的JavaScript代碼也容易導(dǎo)致JavaScript引擎崩潰,從而導(dǎo)致整個瀏覽器崩潰。


2.?性能

由于所有的網(wǎng)頁都在一個進(jìn)程中運行,某個網(wǎng)頁JavaScript代碼運行的很慢或者存在死循環(huán),將會導(dǎo)致整個瀏覽器卡頓或者失去響應(yīng)。并且由于渲染引擎可能存在的內(nèi)存泄露問題,長時間運行的瀏覽器會占用越來越多的內(nèi)存。?


3.?安全

單進(jìn)程架構(gòu)瀏覽器中所有的組件都運行在一個進(jìn)程,很難實現(xiàn)合理的安全環(huán)境。插件和JavaScript腳本可以利用漏洞獲取系統(tǒng)資源權(quán)限,導(dǎo)致很多安全性問題。


三、多進(jìn)程架構(gòu)



2008年,Chromium (Chromium是Chrome的開源實現(xiàn),兩者的主要代碼是一樣的,Chrome相較于Chromium多了一些Google的私有組件。后續(xù)無特殊說明,Chromium等同Chrome)發(fā)布了如上圖的多進(jìn)程架構(gòu)。與單進(jìn)程架構(gòu)的差別在于獨立出了Renderer和Plugin進(jìn)程。不同的進(jìn)程間需要通過IPC來通信。Renderer進(jìn)程即渲染引擎,主要負(fù)責(zé)頁面渲染,包括HTML解析,渲染,JavaScript的執(zhí)行等工作。


該架構(gòu)有效的解決了單進(jìn)程架構(gòu)的三大問題:


1.?穩(wěn)定性

各進(jìn)程是隔離的。單個頁面的組件崩潰只影響它所在的Renderer進(jìn)程,不會導(dǎo)致整個瀏覽器崩潰,有效的解決了穩(wěn)定性問題。


2.?性能

瀏覽器的每個tab都運行在獨立的Renderer進(jìn)程。存在死循環(huán)的JavaScript腳本只會影響當(dāng)前tab,其他頁面仍可正常運行。并且渲染引擎的內(nèi)存泄露也只影響單獨的進(jìn)程,關(guān)閉使用內(nèi)存過多的Renderer即可釋放內(nèi)存,不會影響其他網(wǎng)頁的使用。


3.?安全

多進(jìn)程的架構(gòu)還引入了Sandbox沙盒機制,Renderer進(jìn)程和插件進(jìn)程運行在沙盒中。這些進(jìn)程無法獲取系統(tǒng)資源,資源的獲取訪問需要通過IPC由Browser進(jìn)程執(zhí)行,惡意腳本無法突破沙盒的限制從而影響到系統(tǒng)的安全。



經(jīng)過多年的發(fā)展,Chromium越來越多的功能被分離為獨立的進(jìn)程,例如GPU進(jìn)程,網(wǎng)絡(luò)進(jìn)程。多進(jìn)程雖然解決了穩(wěn)定性,性能,安全性問題。但是過多的進(jìn)程也存在內(nèi)存占用過多和進(jìn)程間通信導(dǎo)致的系統(tǒng)架構(gòu)復(fù)雜度上升等問題。為了解決這些問題,Chromium在2016年提出了以SOA(Services Oriented Architecture)為基礎(chǔ)的高內(nèi)聚,低耦合,易擴展的架構(gòu)。該架構(gòu)期望將功能組件以服務(wù)的形式拆分或聚合,服務(wù)可以運行在獨立的進(jìn)程中也可以合并到單一進(jìn)程。在高端設(shè)備上,服務(wù)可能會運行在獨立的進(jìn)程以增強穩(wěn)定性和性能。在低端設(shè)備上,多個服務(wù)可以合并為單一進(jìn)程以節(jié)省內(nèi)存的使用。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)??


四、Chromium的進(jìn)程和線程

進(jìn)程


Chromium的進(jìn)程模型支持一到多個進(jìn)程。通常的配置有Browser進(jìn)程,Renderer進(jìn)程,GPU進(jìn)程,網(wǎng)絡(luò)進(jìn)程及多個服務(wù)進(jìn)程。在資源較少的設(shè)備上可配置為雙進(jìn)程(Browser進(jìn)程,Renderer進(jìn)程)或單進(jìn)程(Browser進(jìn)程)。需要注意的是,單進(jìn)程模式的代碼沒有經(jīng)過Chromium官方的測試驗證,如果要在產(chǎn)品中使用該模式,需要更多的工作維護單進(jìn)程的穩(wěn)定性。chrome_string_lookup.cc文件中可以查看到Chromium所有可能的進(jìn)程和線程名。下圖是Windows上打開兩個tab時可見的進(jìn)程:



1.Browser/UI進(jìn)程

Web引擎的主進(jìn)程,具有訪問系統(tǒng)資源的權(quán)限。Windows中顯示為瀏覽器進(jìn)程,Android上通常就是App的進(jìn)程。因為主進(jìn)程中通常也負(fù)責(zé)和窗口系統(tǒng)的交互,所以有時也被稱為UI進(jìn)程。早期的時候主進(jìn)程負(fù)責(zé)UI交互,持久化數(shù)據(jù)訪問,網(wǎng)絡(luò)資源下載。最新的Chromium中持久化數(shù)據(jù)訪問,網(wǎng)絡(luò)資源已作為獨立的進(jìn)程存在。


2.Renderer進(jìn)程

渲染進(jìn)程,該進(jìn)程負(fù)責(zé)頁面的渲染和JavaScript腳本的執(zhí)行。根據(jù)配置的不同,能存在多個Renderer進(jìn)程。簡單來說打開的每個網(wǎng)頁可能會創(chuàng)建一個renderer進(jìn)程,但在資源較少的情況下,可以配置域相同的網(wǎng)頁共享一個進(jìn)程,甚至只有一個renderer進(jìn)程。


Renderer進(jìn)程是運行在Sandbox中的,該進(jìn)程沒有訪問系統(tǒng)資源的權(quán)限,所有對資源的訪問需求都通過IPC委托給其他功能進(jìn)程,如網(wǎng)絡(luò)進(jìn)程,GPU進(jìn)程。


3.GPU進(jìn)程

執(zhí)行GPU命令的進(jìn)程,即實際調(diào)用opengl es接口的進(jìn)程。Renderer進(jìn)程是不能訪問GPU的,他對GPU的操作需要通過CommandBuffer委托給GPU進(jìn)程執(zhí)行??梢耘渲貌皇褂锚毩⒌腉PU進(jìn)程,這時該進(jìn)程退化為一個線程運行在主進(jìn)程中。


4.Network Service進(jìn)程

執(zhí)行資源加載的進(jìn)程,文檔資源通過該進(jìn)程下載并通過Share Memory發(fā)送給Renderer進(jìn)程解析。同樣的該進(jìn)程可配置為主進(jìn)程中的一個線程。


5.Storage Service進(jìn)程

為local/session storage, service worker, indexed_db提供存儲服務(wù)。


6.Data Decoder Service進(jìn)程

解碼進(jìn)程,執(zhí)行image,zip等文件的解碼。


7.Audio Service進(jìn)程

音頻進(jìn)程,處理音頻文件。


8.Zygote進(jìn)程

功能和Android的zygote一樣,用于加速Renderer進(jìn)程的創(chuàng)建。


五、線程

Chromium的架構(gòu)設(shè)計最大化的利用了現(xiàn)代處理的的多核架構(gòu),各進(jìn)程中存在很多線程,每個線程負(fù)責(zé)特定的任務(wù)執(zhí)行,Chromium常見的線程為以下幾類:


1.線程池相關(guān)線程,各進(jìn)程都會存在的線程,進(jìn)程中可見多個同名的ThreadPool線程。


2.IO相關(guān)線程,負(fù)責(zé)文件的訪問,進(jìn)程間的通信等工作。Browser進(jìn)程的IO線程為Chrome_IOThread,其他進(jìn)程的IO線程為Chrome_ChildIOThread。


3.Browser進(jìn)程中的線程



4.Renderer進(jìn)程中的線程



5.GPU進(jìn)程中的線程



六、Android Webview的進(jìn)程


Android 系統(tǒng)Webivew是谷歌為Android 提供的 Webivew組件。Android 系統(tǒng)Webivew基于Chromium代碼(4.4版本之后),由于嵌入式平臺的硬件差異,Android 系統(tǒng)Webivew的進(jìn)程配置和PC上的Chromium有所不同。


七、Android系統(tǒng)Webview的進(jìn)程


Android 系統(tǒng)Webivew的進(jìn)程架構(gòu)遵循Chromium的架構(gòu)。但是由于平臺的限制,在Android L, M, 和N 上,Webivew為單進(jìn)程模式。在 Android O及之后設(shè)備上,Webivew為多進(jìn)程模式。為了節(jié)省內(nèi)存,多進(jìn)程模式的Webivew也只有Browser和Renderer進(jìn)程,GPU和網(wǎng)絡(luò)服務(wù)都以線程的方式運行在Browser進(jìn)程中,并且renderer進(jìn)程也只有一個。


Android N 中Webivew可以通過全局配置獲取進(jìn)程模式。也可通過開發(fā)者菜單設(shè)置使用多進(jìn)程模式(廠商的開發(fā)者菜單中不一定有此選項)。


Android O及之后的版本,Webivew默認(rèn)為多進(jìn)程模式,用戶無法修改。雖然框架的代碼中仍有進(jìn)程配置相關(guān)的代碼,但是App無法通過Webivew接口或manifest配置。



八、三方Webview


國內(nèi)大廠通常會根據(jù)自己的需求基于Chromium引擎開發(fā)定制化的Webview,進(jìn)程配置和Android系統(tǒng)Webview有所不同。開發(fā)者可以通過App各子進(jìn)程中的關(guān)鍵線程名判斷該進(jìn)程屬于Chromium的哪個子進(jìn)程,例如擁有CrRendererMain線程的進(jìn)程通常是renderer進(jìn)程。


下面是一些常見應(yīng)用中的進(jìn)程,定制化的Webview通常會使用GPU進(jìn)程以提高性能。


九、小結(jié)

Chromium的進(jìn)程架構(gòu)目前已演進(jìn)到面向服務(wù)的多進(jìn)程架構(gòu),隨著硬件設(shè)備的發(fā)展,未來可能會有更多的服務(wù)進(jìn)程,充分的利用硬件資源。對于資源受限的設(shè)備,Chromium的進(jìn)程架構(gòu)也能方便的進(jìn)行配置調(diào)整以減少資源使用。Web引擎開發(fā)者可以根據(jù)實際的場景來調(diào)整進(jìn)程配置,應(yīng)用和底層開發(fā)者也可根據(jù)實際的進(jìn)程配置情況來選擇應(yīng)用或者內(nèi)核的優(yōu)化策略。


原文作者:內(nèi)核工匠




Chromium多進(jìn)程架構(gòu),你知道多少?的評論 (共 條)

分享到微博請遵守國家法律
顺义区| 望江县| 即墨市| 陆河县| 久治县| 宁陕县| 尼勒克县| 昂仁县| 庆阳市| 诸暨市| 澄城县| 甘孜| 阳信县| 南澳县| 博湖县| 佛冈县| 清苑县| 龙陵县| 普陀区| 安徽省| 台湾省| 汉阴县| 安泽县| 额济纳旗| 夹江县| 怀仁县| 龙南县| 合阳县| 新巴尔虎右旗| 孟州市| 叶城县| 自贡市| 鄂托克前旗| 石阡县| 乐东| 景泰县| 冷水江市| 监利县| 扶风县| 黎城县| 上虞市|