瀏覽器進(jìn)程篇

1.線程和進(jìn)程的區(qū)別:
多線程可以并行處理任務(wù)纵苛,但是線程是不能單獨(dú)存在的,它是由進(jìn)程來啟動(dòng)和管理的莹妒。
那什么又是進(jìn)程呢?一個(gè)進(jìn)程就是一個(gè)程序的運(yùn)行實(shí)例绰上。詳細(xì)解釋就是旨怠,啟動(dòng)一個(gè)程序的時(shí)候,操作系統(tǒng)會(huì)為該程序創(chuàng)建一塊內(nèi)存蜈块,用來存放代碼鉴腻、運(yùn)行中的數(shù)據(jù)和一個(gè)執(zhí)行任務(wù)的主線程,我們把這樣的一個(gè)運(yùn)行環(huán)境叫進(jìn)程百揭。為了讓你更好地理解上述計(jì)算過程爽哎,我畫了下面這張對比圖:

image.png

從圖中可以看到,線程是依附于進(jìn)程的器一,而進(jìn)程中使用多線程并行處理能提升運(yùn)算效率课锌。
總結(jié)來說,進(jìn)程和線程之間的關(guān)系有以下 4 個(gè)特點(diǎn)。

  1. 進(jìn)程中的任意一線程執(zhí)行出錯(cuò)渺贤,都會(huì)導(dǎo)致整個(gè)進(jìn)程的崩潰雏胃。
  2. 線程之間共享進(jìn)程中的數(shù)據(jù)。
  3. 當(dāng)一個(gè)進(jìn)程關(guān)閉之后志鞍,操作系統(tǒng)會(huì)回收進(jìn)程所占用的內(nèi)存瞭亮。
  4. 進(jìn)程之間的內(nèi)容相互隔離。

單進(jìn)程瀏覽器時(shí)代

在了解了進(jìn)程和線程之后固棚,我們再來一起看下單進(jìn)程瀏覽器的架構(gòu)统翩。顧名思義,單進(jìn)程瀏覽器是指瀏覽器的所有功能模塊都是運(yùn)行在同一個(gè)進(jìn)程里此洲。


image.png

如此多的功能模塊運(yùn)行在一個(gè)進(jìn)程里厂汗,是導(dǎo)致單進(jìn)程瀏覽器不穩(wěn)定、不流暢和不安全的一個(gè)主要因素呜师。下面我就來一一分析下出現(xiàn)這些問題的原因

問題 1:不穩(wěn)定早期瀏覽器需要借助于插件來實(shí)現(xiàn)諸如 Web 視頻面徽、Web 游戲等各種強(qiáng)大的功能,但是插件是最容易出問題的模塊匣掸,并且還運(yùn)行在瀏覽器進(jìn)程之中趟紊,所以一個(gè)插件的意外崩潰會(huì)引起整個(gè)瀏覽器的崩潰。除了插件之外碰酝,渲染引擎模塊也是不穩(wěn)定的霎匈,通常一些復(fù)雜的 JavaScript 代碼就有可能引起渲染引擎模塊的崩潰。和插件一樣送爸,渲染引擎的崩潰也會(huì)導(dǎo)致整個(gè)瀏覽器的崩潰铛嘱。

問題 2:不流暢從上面的“單進(jìn)程瀏覽器架構(gòu)示意圖”可以看出,所有頁面的渲染模塊袭厂、JavaScript 執(zhí)行環(huán)境以及插件都是運(yùn)行在同一個(gè)線程中的墨吓,這就意味著同一時(shí)刻只能有一個(gè)模塊可以執(zhí)行。比如纹磺,下面這個(gè)無限循環(huán)的腳本:function freeze() { while (1) { console.log("freeze"); }}freeze();如果讓這個(gè)腳本運(yùn)行在一個(gè)單進(jìn)程瀏覽器的頁面里帖烘,你感覺會(huì)發(fā)生什么?因?yàn)檫@個(gè)腳本是無限循環(huán)的橄杨,所以當(dāng)其執(zhí)行時(shí)秘症,它會(huì)獨(dú)占整個(gè)線程,這樣導(dǎo)致其他運(yùn)行在該線程中的模塊就沒有機(jī)會(huì)被執(zhí)行式矫。因?yàn)闉g覽器中所有的頁面都運(yùn)行在該線程中乡摹,所以這些頁面都沒有機(jī)會(huì)去執(zhí)行任務(wù),這樣就會(huì)導(dǎo)致整個(gè)瀏覽器失去響應(yīng)采转,變卡頓聪廉。這塊內(nèi)容要繼續(xù)往深的地方講就到頁面的事件循環(huán)系統(tǒng)了,具體相關(guān)內(nèi)容我會(huì)在后面的模塊中為你深入講解。除了上述腳本或者插件會(huì)讓單進(jìn)程瀏覽器變卡頓外板熊,頁面的內(nèi)存泄漏也是單進(jìn)程變慢的一個(gè)重要原因框全。通常瀏覽器的內(nèi)核都是非常復(fù)雜的,運(yùn)行一個(gè)復(fù)雜點(diǎn)的頁面再關(guān)閉頁面邻邮,會(huì)存在內(nèi)存不能完全回收的情況竣况,這樣導(dǎo)致的問題是使用時(shí)間越長克婶,內(nèi)存占用越高筒严,瀏覽器會(huì)變得越慢。

問題 3:不安全這里依然可以從插件和頁面腳本兩個(gè)方面來解釋該原因情萤。插件可以使用 C/C++ 等代碼編寫鸭蛙,通過插件可以獲取到操作系統(tǒng)的任意資源,當(dāng)你在頁面運(yùn)行一個(gè)插件時(shí)也就意味著這個(gè)插件能完全操作你的電腦筋岛。如果是個(gè)惡意插件娶视,那么它就可以釋放病毒、竊取你的賬號密碼睁宰,引發(fā)安全性問題肪获。至于頁面腳本,它可以通過瀏覽器的漏洞來獲取系統(tǒng)權(quán)限柒傻,這些腳本獲取系統(tǒng)權(quán)限之后也可以對你的電腦做一些惡意的事情孝赫,同樣也會(huì)引發(fā)安全問題。以上這些就是當(dāng)時(shí)瀏覽器的特點(diǎn)红符,不穩(wěn)定青柄,不流暢,而且不安全预侯。這是一段不堪回首的過去致开,也許你沒有經(jīng)歷過,不過你可以想象一下這樣的場景:當(dāng)你正在用瀏覽器打開多個(gè)頁面時(shí)萎馅,突然某個(gè)頁面崩潰了或者失去響應(yīng)双戳,隨之而來的是整個(gè)瀏覽器的崩潰或者無響應(yīng)。

目前多進(jìn)程架構(gòu)

不過 Chrome 的發(fā)展是滾滾向前的糜芳,相較之前拣技,目前的架構(gòu)又有了很多新的變化。我們先看看最新的 Chrome 進(jìn)程架構(gòu)耍目,你可以參考下圖:


image.png

從圖中可以看出膏斤,最新的 Chrome 瀏覽器包括:1 個(gè)瀏覽器(Browser)主進(jìn)程、1 個(gè) GPU 進(jìn)程邪驮、1 個(gè)網(wǎng)絡(luò)(NetWork)進(jìn)程莫辨、多個(gè)渲染進(jìn)程和多個(gè)插件進(jìn)程。
下面我們來逐個(gè)分析下這幾個(gè)進(jìn)程的功能。

  • 瀏覽器進(jìn)程沮榜。主要負(fù)責(zé)界面顯示盘榨、用戶交互、子進(jìn)程管理蟆融,同時(shí)提供存儲等功能草巡。
  • 渲染進(jìn)程。核心任務(wù)是將 HTML型酥、CSS 和 JavaScript 轉(zhuǎn)換為用戶可以與之交互的網(wǎng)頁山憨,排版引擎 Blink 和 JavaScript 引擎 V8 都是運(yùn)行在該進(jìn)程中,默認(rèn)情況下弥喉,Chrome 會(huì)為每個(gè) Tab 標(biāo)簽創(chuàng)建一個(gè)渲染進(jìn)程郁竟。出于安全考慮,渲染進(jìn)程都是運(yùn)行在沙箱模式下由境。
  • GPU 進(jìn)程棚亩。其實(shí),Chrome 剛開始發(fā)布的時(shí)候是沒有 GPU 進(jìn)程的虏杰。而 GPU 的使用初衷是為了實(shí)現(xiàn) 3D CSS 的效果讥蟆,只是隨后網(wǎng)頁、Chrome 的 UI 界面都選擇采用 GPU 來繪制纺阔,這使得 GPU 成為瀏覽器普遍的需求瘸彤。最后,Chrome 在其多進(jìn)程架構(gòu)上也引入了 GPU 進(jìn)程州弟。
  • 網(wǎng)絡(luò)進(jìn)程钧栖。主要負(fù)責(zé)頁面的網(wǎng)絡(luò)資源加載,之前是作為一個(gè)模塊運(yùn)行在瀏覽器進(jìn)程里面的婆翔,直至最近才獨(dú)立出來拯杠,成為一個(gè)單獨(dú)的進(jìn)程。
  • 插件進(jìn)程啃奴。主要是負(fù)責(zé)插件的運(yùn)行潭陪,因插件易崩潰,所以需要通過插件進(jìn)程來隔離最蕾,以保證插件進(jìn)程崩潰不會(huì)對瀏覽器和頁面造成影響依溯。
    不過凡事都有兩面性,雖然多進(jìn)程模型提升了瀏覽器的穩(wěn)定性瘟则、流暢性和安全性黎炉,但同樣不可避免地帶來了一些問題:
    更高的資源占用。因?yàn)槊總€(gè)進(jìn)程都會(huì)包含公共基礎(chǔ)結(jié)構(gòu)的副本(如 JavaScript 運(yùn)行環(huán)境)醋拧,這就意味著瀏覽器會(huì)消耗更多的內(nèi)存資源慷嗜。
    更復(fù)雜的體系架構(gòu)淀弹。瀏覽器各模塊之間耦合性高、擴(kuò)展性差等問題庆械,會(huì)導(dǎo)致現(xiàn)在的架構(gòu)已經(jīng)很難適應(yīng)新的需求了薇溃。
    對于上面這兩個(gè)問題,Chrome 團(tuán)隊(duì)一直在尋求一種彈性方案缭乘,既可以解決資源占用高的問題沐序,也可以解決復(fù)雜的體系架構(gòu)的問題。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堕绩,一起剝皮案震驚了整個(gè)濱河市策幼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逛尚,老刑警劉巖垄惧,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁愿,死亡現(xiàn)場離奇詭異绰寞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铣口,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門滤钱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脑题,你說我怎么就攤上這事件缸。” “怎么了叔遂?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵他炊,是天一觀的道長。 經(jīng)常有香客問我已艰,道長痊末,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任哩掺,我火速辦了婚禮凿叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚼吞。我一直安慰自己盒件,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布舱禽。 她就那樣靜靜地躺著炒刁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誊稚。 梳的紋絲不亂的頭發(fā)上翔始,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天飒筑,我揣著相機(jī)與錄音,去河邊找鬼绽昏。 笑死协屡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的全谤。 我是一名探鬼主播肤晓,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼认然!你這毒婦竟也來了补憾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤卷员,失蹤者是張志新(化名)和其女友劉穎盈匾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毕骡,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡削饵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了未巫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窿撬。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叙凡,靈堂內(nèi)的尸體忽然破棺而出劈伴,到底是詐尸還是另有隱情,我是刑警寧澤握爷,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布跛璧,位于F島的核電站,受9級特大地震影響新啼,放射性物質(zhì)發(fā)生泄漏追城。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一师抄、第九天 我趴在偏房一處隱蔽的房頂上張望漓柑。 院中可真熱鬧,春花似錦叨吮、人聲如沸辆布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋玲。三九已至,卻和暖如春涵叮,著一層夾襖步出監(jiān)牢的瞬間惭蹂,已是汗流浹背伞插。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盾碗,地道東北人媚污。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像廷雅,于是被迫代替她去往敵國和親耗美。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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