<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 進程和線程 一個進程就是一個程序的運行實例。詳細解釋就是,啟動一個程序的時候,操作系統會為該程序創建一塊內存,用來存放**代碼**、運行中的**數據**和一個**執行任務**的主線程,我們把這樣的一個運行環境叫進程。 <br> **線程是依附于進程的,而進程中使用多線程并行處理能提升運算效率。** <br> 進程和線程之間的關系有以下 4 個特點: * 進程中的任意一線程執行出錯,都會導致整個進程的崩潰。 * 線程之間共享進程中的數據。 * 當一個進程退出時,操作系統會回收該進程所申請的所有資源 * 即使其中任意線程因為操作不當導致內存泄漏,當進程退出時,這些內存也會被正確回收。 * 進程之間的內容相互隔離。 * 如果進程之間需要進行數據的通信,這時候,就需要使用用于進程間通信(IPC)的機制了。 # 單進程瀏覽器時代 單進程瀏覽器是指瀏覽器的所有功能模塊都是運行在同一個進程里,這些模塊包含了網絡、插件、JavaScript 運行環境、渲染引擎和頁面等。 ![](https://img.kancloud.cn/07/4b/074b71dc9e687bd63976c15d371b5816_1142x469.png) <br> 如此多的功能模塊運行在一個進程里,是導致單進程瀏覽器不穩定、不流暢和不安全的一個主要因素。 * 不穩定 * 插件是最容易出問題的模塊,并且還運行在瀏覽器進程之中,所以一個插件的意外崩潰會引起整個瀏覽器的崩潰。 * 渲染引擎模塊也是不穩定的,通常一些復雜的 JavaScript 代碼就有可能引起渲染引擎模塊的崩潰。和插件一樣,渲染引擎的崩潰也會導致整個瀏覽器的崩潰。 * 不流暢 * 所有頁面的渲染模塊、JavaScript 執行環境以及插件都是運行在同一個線程中的,這就意味著同一時刻只能有一個模塊可以執行。 * 通常瀏覽器的內核都是非常復雜的,運行一個復雜點的頁面再關閉頁面,會存在內存不能完全回收的情況,這樣導致的問題是使用時間越長,內存占用越高,瀏覽器會變得越慢。 * 不安全 * 插件可以使用 C/C++ 等代碼編寫,通過插件可以獲取到操作系統的任意資源,當你在頁面運行一個插件時也就意味著這個插件能完全操作你的電腦。 <br> <br> # 多進程瀏覽器時代 ## 早期多進程架構 ![](https://img.kancloud.cn/b3/70/b3701031e3ce3c62b4d96c27bb72ce79_1142x725.png) 從圖中可以看出,Chrome 的頁面是運行在單獨的渲染進程中的,同時頁面里的插件也是運行在單獨的插件進程之中,而進程之間是通過 IPC 機制進行通信(如圖中虛線部分)。 ### 解決不穩定 由于進程是相互隔離的,所以當一個頁面或者插件崩潰時,影響到的僅僅是當前的頁面進程或者插件進程,并不會影響到瀏覽器和其他頁面 ### 解決不流暢 * JavaScript 也是運行在渲染進程中的,所以即使 JavaScript 阻塞了渲染進程,影響到的也只是當前的渲染頁面 * 因為當關閉一個頁面時,整個渲染進程也會被關閉,之后該進程所占用的內存都會被系統回收,這樣就輕松解決了瀏覽器頁面的內存泄漏問題 ### 解決不安全 * 使用安全沙箱 <br> ## 目前多進程架構 ![](https://img.kancloud.cn/5b/eb/5beb04e75f7827e75a7639440f69f861_1142x494.png) <br> * 瀏覽器進程。主要負責界面顯示、用戶交互、子進程管理,同時提供存儲等功能。 * 渲染進程。核心任務是將 HTML、CSS 和 JavaScript 轉換為用戶可以與之交互的網頁,排版引擎 Blink 和 JavaScript 引擎 V8 都是運行在該進程中,默認情況下,Chrome 會為每個 Tab 標簽創建一個渲染進程。出于安全考慮,渲染進程都是運行在沙箱模式下。 * GPU 進程。其實,Chrome 剛開始發布的時候是沒有 GPU 進程的。而 GPU 的使用初衷是為了實現 3D CSS 的效果,只是隨后網頁、Chrome 的 UI 界面都選擇采用 GPU 來繪制,這使得 GPU 成為瀏覽器普遍的需求。最后,Chrome 在其多進程架構上也引入了 GPU 進程。 * 網絡進程。主要負責頁面的網絡資源加載,之前是作為一個模塊運行在瀏覽器進程里面的,直至最近才獨立出來,成為一個單獨的進程。 * 插件進程。主要是負責插件的運行,因插件易崩潰,所以需要通過插件進程來隔離,以保證插件進程崩潰不會對瀏覽器和頁面造成影響。 <br> <br> 雖然多進程模型提升了瀏覽器的穩定性、流暢性和安全性,但同樣不可避免地帶來了一些問題: * 更高的資源占用。因為每個進程都會包含公共基礎結構的副本(如 JavaScript 運行環境),這就意味著瀏覽器會消耗更多的內存資源。 * 更復雜的體系架構。瀏覽器各模塊之間耦合性高、擴展性差等問題,會導致現在的架構已經很難適應新的需求了。 <br> <br> # 未來面向服務的架構 為了解決這些問題,在 2016 年,Chrome 官方團隊使用“面向服務的架構”(Services Oriented Architecture,簡稱 SOA)的思想設計了新的 Chrome 架構。也就是說 Chrome 整體架構會朝向現代操作系統所采用的“面向服務的架構” 方向發展,原來的各種模塊會被重構成獨立的服務(Service),每個服務(Service)都可以在獨立的進程中運行,訪問服務(Service)必須使用定義好的接口,通過 IPC 來通信,從而構建一個更內聚、松耦合、易于維護和擴展的系統,更好實現 Chrome 簡單、穩定、高速、安全的目標。如果你對面向服務的架構感興趣,你可以去網上搜索下資料,這里就不過多介紹了。 ![](https://img.kancloud.cn/3c/76/3c765cd416f862fea70f840fa9e00aea_1142x582.png) <br> # 參考資料 [瀏覽器工作原理](https://time.geekbang.org/column/article/113513)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看