1. 程式人生 > >為什麼瀏覽器會使用多程序架構。(轉)

為什麼瀏覽器會使用多程序架構。(轉)

在使用瀏覽器時偶然發現雖然僅僅開啟一個標籤頁,但是在工作管理員內發現有多個瀏覽器程序在執行,佔用了不小的記憶體,當時很納悶:為什麼一個瀏覽器卻需要多個程序呢?不經意間在網上發現這篇文章,以Google chrome瀏覽器為例,講解了使用多程序構架的瀏覽器。翻譯給大家,希望對有英語閱讀困難的同學有所幫助,第一次翻譯技術文章,好多術語不明白啥意思,也沒有搜到都是憑理解翻譯的。如cross-site frame,如果有錯誤請不吝指正。

   原文地址:

                             瀏覽器的多程序構架

   跟現在的很多瀏覽器不一樣,谷歌chrome瀏覽器使用多個程序來隔離不同的網頁和你的計算機。在這篇部落格中我將會解釋為什麼在現在的網路條件下使用多程序架構是一個巨大的進步。我還會討論瀏覽器的不同部分分別屬於什麼程序以及在什麼情況下google chrome為建立一個新的程序。

    1:為什麼在一個瀏覽器中使用多個程序。

    在瀏覽器剛被設計出來的時候,那時的網頁非常的簡單,幾乎沒有動態的程式碼。這對僅使用一個程序渲染所有要訪問的網頁卻仍然保持非常低的資源佔有率是行得通的。

    然而在今天我們看到大量網頁轉而使用動態網頁,從含有大量javascript和flash的網頁到像完全成熟的網路應用如GMail。這些應用的很大一部分是在瀏覽器中執行的,就像執行在作業系統之上的應用程式一樣。跟作業系統一樣,瀏覽器必須讓這些應用互相分離。

    除此之外,瀏覽器中負責渲染HTML,JavaScript和CSS的部分日益的複雜。在這些渲染引擎在演化的過程中會頻繁的出現bug,有些bug會導致渲染引擎崩潰。不僅如此,渲染引擎會經常性的在網路上遇到不可信、甚至是惡意的程式碼,它們會利用這些漏洞在你的電腦上安裝惡意的軟體。

    在當今世界,把所有東西都放進一個程序的瀏覽器面臨在健壯性,響應速度,安全性方面的挑戰。如果瀏覽器中的一個網路應用崩潰的話,這回波及括所有被開啟的應用在內的任何其他應用。單執行緒的網路應用不得不經常相互競爭以獲得的cpu時間,這有時會導致整個瀏覽器無法響應。安全性也同樣不容小覷,因為僅僅一個頁面就可以利用渲染引擎的某個漏洞獲得對整臺計算機的控制權。

    然而,並不是非這樣做不可。網路應用在設計的時候就是在瀏覽器中相互獨立且並行的執行。它們不需要對磁碟和裝置的訪問權。這些被應用在網路上的安全策略保證了這些,使讓你在訪問大部分的頁面時並不需要擔心資料和計算機的安全性。這意味著可以讓瀏覽器中的應用在不破壞彼此的情況下完全相互隔離。對於瀏覽器中的外掛如flash也是一樣的,它們與瀏覽器鬆散的耦合在一起且相互隔離,這沒有任何問題。

    Google Chrome充分利用了這種特性,它將外掛或是網路應用放在與瀏覽器本身不同的程序中。在一個渲染引擎中的崩潰並不會影響瀏覽器本身或是其他網路應用。這意味著作業系統可以併發的執行網路應用來提高響應速度,如果一個特定的網路應用程式或是外掛停止響應時瀏覽器本身並不會被死鎖。這也意味著我們可以在一個嚴格意義上的沙箱內執行渲染引擎程序,幫助減少發生錯誤時造成的損失。

    有趣的是,使用多程序意味著Google Chrome可以有自己的工作管理員,你可以通過右擊瀏覽器標題欄開啟。這個工作管理員可以讓你跟蹤每個網路應用和外掛的資源使用率,而不是針對整個瀏覽器。

它也可以讓你在不需要重啟瀏覽器的情況下終止任何停止響應網路應用或外掛。

    針對以上原因,Google Chrome瀏覽器的多程序構架與單程序瀏覽器相比有更強的健壯性,更快的響應速度,同時更安全。

     2:每個程序內都有什麼。

     Google Chrome建立三種不同型別的程序:瀏覽器程序,渲染器程序,外掛程序。

    瀏覽器程序:瀏覽器程序只有一個,用於管理標籤頁、視窗和瀏覽器本身。這個程序同時負責處理所有跟磁碟、網路、使用者輸入和顯示的互動,然而它不分析和渲染任何網頁內容。

    渲染器程序:渲染器程序會建立多個程序,每個都負責渲染網頁。渲染器程序中包含用於操作HTML,JavaScript,CSS,圖片和其他內容的複雜的邏輯。我們使用了也同樣被Apple Safari瀏覽器使用的開源的WebKit渲染引擎實現以上功能。每個渲染器程序都執行在沙箱內,這意味著它對磁碟、網路和顯示器沒有直接的訪問許可權。所有跟網路應用的互動,包括使用者輸入事件和螢幕繪製都必須通過瀏覽器程序。這可以讓瀏覽器程序監視渲染器的可疑行為,一旦發現其從事破壞活動就將其終止。

     外掛程序:瀏覽器程序同樣為處於使用狀態的每種型別的外掛建立一個程序,如:Flash、Quicktime或Adobe reader。這些程序僅僅包含外掛本身以及和瀏覽器程序、渲染器程序互動的膠水程式碼。

    3:在什麼情況下瀏覽器會建立程序。

     一旦Google Chrome建立了一個瀏覽器程序,它一般會為你所訪問的每個站點建立一個渲染器程序。這種做法旨在將不同站點的不同網頁相互隔離。

    你可以這樣認為:瀏覽器對每個標籤頁面使用不同的程序,但是允許兩個相關的且屬於同一站點的網頁共享同一個渲染器程序。例如,如果開啟另一個也使用JavaScript的標籤頁,或者你打開了屬於同一個站點的新標籤頁,這些標籤頁將會共享一個渲染器程序。這可以讓這些標籤頁中的頁面通過JavaScript通訊,共享快取物件。相反,如果你在標籤頁的位址列裡輸入一個不同站點的URL,這個標籤頁會被交換到一個新的渲染器程序。

    跟已存在的頁面保持相容對我們來講非常重要。基於此,我們將每個站點定義一個像google.com或bbc.co.uk註冊的域名,這意味著我們可以認為像mail.google.com和maps.google.com一樣的子域名是屬於同一個站點。這很有必要,因為存在屬於不同子域名的標籤頁面通過Javascript相互通訊的情況,因此我們讓它們使用同一個渲染器程序。

    然而,對這種基本的方法要有以下注意事項。如果建立太多的程序,電腦的效能會降低,因此我們限定了建立渲染程序的最大數量(大多數情況下是20)。當達到這個限制時我們會為新標籤頁頁面重用已經存在的渲染器程序。因此,同一個渲染器程序可以被用於多個站點。我們不把跨站點的訪問放在原來的程序,同時也不將所有型別的交叉站點導航都交換到新的渲染器程序。目前,我們僅僅將瀏覽器程序本身的導航交換到新的標籤頁程序。儘管有這麼多告誡,在平常使用時google chrome還是會將不同站點相互隔離。

對於每一種型別的外掛,當你第一次訪問一個使用該外掛的網頁時,google chrome會建立一個外掛程序。只有當所有使用該外掛的所有網頁都被關閉之後,該程序才會被撤銷。

隨著我們對建立和交換渲染器程序策略的進一步細化,我們會發布更多的部落格。同時我們希望在你使用Google chrome時會體驗到多程序構建帶來的諸多好處。

                                                   本文由Charlie Reis發表

                                                      ithzhang翻譯

                                                     轉載請註明出處,謝謝!!

--------------------- 本文來自 ithzhang 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/ithzhang/article/details/7917754?utm_source=copy