從 chrome 瀏覽器說說進行與線程

在正式開始講進程和線程以前首先須要理解的一個概念就是並行處理,由於當你理解了並行處理以後,你對進程和線程的理解就會輕鬆不少。瀏覽器

什麼是並行處理

從字面意思就能夠理解,並行處理的意思就是,同一時刻處理多個任務。好比咱們要計算下面兩個表達式的值:安全

A = 1 + 2
B = 2 + 3

從代碼編譯的角度這個過程能夠被拆分爲三部分:網絡

  • 第一步:計算 A = 1 +2
  • 第二步:計算 B = 2 + 3
  • 第三步:顯示最後的計算結果

若是咱們使用單線程來處理,瀏覽器就會按照我上面的步驟分3步來執行。多線程

若是採用多線程最後的結果會是怎樣的呢?架構

多線程只須要分兩步來進行處理:操作系統

  • 第一步:使用兩個線程同時執行前面的兩個任務
  • 第二步:輸出結果

到底什麼是進程?

首先須要明確的一個概念是,線程是不能夠單獨存在的,線程是依賴於進程而存在的而。插件

那什麼是進程呢?線程

一個進程就是一個程序的運行實例。設計

官方的解釋是,啓動一個程序的時候,操做系統會爲該程序建立一塊內存,用來存放代碼、運行中的數據和一個執行任務的主線程,咱們把這樣一個運行環境叫作進程。code

進程和線程之間的關係

進程中的任何一個線程執行出錯,都會致使整個進程奔潰

舉一個例子:

A = 1 * 0
B = 2 / 0

當上面的程序在計算 B 的時候,因爲分母爲 0 ,會致使執行出錯,由於線程執行出錯會致使整個進程的崩潰,進程一旦崩潰,其餘線程的執行也就沒有結果了。

線程之間共享進程中的數據

線程之間能夠對進程中的公共數據進行操做。

當關閉一個進程以後,操做系統會回收進程所佔用的內存

當一個進程退出時,操做系統會回收該進程所佔用的全部資源;即便其中任意線程因操做不當致使內存泄漏,所佔用的內存也會被正確回收。

進程之間的內容相互隔離

進程隔離是爲了保護操做系統中各自的進程互不干擾,每個進程只能訪問本身所佔有的數據,這樣就避免了進程A寫入數據到進程B的狀況出現。

同時,也正由於進程之間的數據是相互隔離的,因此當一個進程崩潰了或者是掛起了,是不會影響到其餘的進程的。

可是進程之間也不是絕對的隔離,若是進程之間須要數據的通訊,這個時候,就須要使用進程間通訊(IPC) 的機制了。

瀏覽器的多進程架構

最新的 Chrome 瀏覽器包括:1個瀏覽器主進程、1個GPU進程、1個網絡進程、多個渲染進程和多個插件進程。

下面咱們來講說這幾個進程的主要功能:

  • 瀏覽器進程。主要負責頁面顯示、用戶交互、子進程管理,同時提供存儲等功能。
  • 渲染進程。核心任務是將HTML、CSS 和 JavaScript 轉換爲用戶能夠與之交互的網頁,排版引擎 Blink 和 V8 引擎都是運行在這個進程中,默認狀況下,Chrome 會爲每一個 Tab 標籤建立一個渲染進程。同時,處於安全考慮,渲染進程都是運行在沙箱模式下。
  • GPU 進程。Chrome 在剛開發發佈的時候是沒有 GPU 進程的。而 GPU 的使用初衷是爲了實現 3D CSS 效果,只是隨後網頁、Chrome 的 UI 界面都選擇採用 GPU 來繪製,這使得 GPU 稱爲瀏覽器廣泛的需求。最後,Chrome 在其多進程架構之上也引入了 GPU 進程。
  • 網絡進程。主要負責頁面的網絡資源加載,以前是做爲一個模塊運行在瀏覽器進程裏面的,直至最近才獨立出來,成爲一個單獨的進程。
  • 插件進程。主要是負責插件的運行,由於插件容易崩潰,因此須要經過插件進程來隔離,以保證進程崩潰不會對瀏覽器和頁面形成影響。

瀏覽器的多進程架構帶來的問題

雖然多進程模型提升了瀏覽器的穩定性、流暢性和安全性,但一樣布不可避免的帶來了一些問題:

  • 更高的資源佔用。由於每一個進程都會包含公共基礎結構的副本(如 JavaScript 的運行環境),這就意味着瀏覽器會消耗更多的內存資源。
  • 更復雜的體系結構。瀏覽器各模塊之間的耦合性高、擴展性差等問題,會致使如今的架構已經很難適應需求了。

面向將來的服務架構

爲了解決目前的瀏覽器架構所帶來的問題,在2016年,Chrome 官方團隊使用」面向服務的架構「的思想設計了新的 Chrome 架構。

也就是說 Chrome 總體架構會朝向現代操做系統所採用的」面向服務的架構「方向發展,原來的各類模塊會被重構成獨立的服務,每一個服務均可以在獨立的進程中運行,訪問服務必須使用定義好的接口,經過 IPC 來通訊,從而構建一個更內聚、鬆耦合、易於維護和擴展的系統,更好的實現 Chrome 簡單、穩定、高速、安全的目標。

相關文章
相關標籤/搜索