動態

詳情 返回 返回

瀏覽器的進程和線程 - 動態 詳情

瀏覽器的進程和線程

前言

  要理解瀏覽器的進程和線程,首先需要理解一句話:進程是CPU分配資源的最小單位,線程是CPU調度的最小單位。

  應用程序在運行時,CPU會分配一塊可獨立運行的內存,即進程,他是應用程序運行的載體。進程一般由程序,數據集合和進程控制塊三部分組成。程序用於描述進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所需要的數據和工作區;程序控制塊包含進程的描述信息和控制信息,是進程存在的唯一標誌;

  線程是一種比進程還小的抽象,在早期的操作系統中並沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位,他相當於一個進程只有一個線程,進程本身就是線程。所以線程有時被稱為輕量級進程。

  後來,隨着計算機的發展,對多個任務之間上下文切換的效率要求越來越高,就抽象出一個更小的概念--線程,一般一個進程會有多個線程。線程的特點是:線程廉價,線程之間切換的花銷較小,啓動和退出較快,對系統資源的衝擊也比較小。

對於進程和線程有一個通俗的比喻:進程就像一個工廠,線程就像工廠中的員工,工廠與工廠之間相互獨立,工廠中的員工相互協作完成任務,每個工廠至少都有一個員工,員工之間共享工廠的空間。

這段話對應的是:

  1. 工廠=進程=cpu分配的一塊可獨立運行的內存;
  2. 進程與進程之間相互獨立;
  3. 進程中至少有一個線程;
  4. 進程中的所有線程共享同一空間;
  5. 進程中的線程相互協作;

瞭解了進程和線程,現在具體瞭解下瀏覽器的進程和線程;

瀏覽器運行時會創建相關進程:
  1. Browser進程,是瀏覽器的主進程,負責協調,主控,只有一個進程,瀏覽器打開時會創建這個進程;
    作用:
    (1)負責瀏覽器頁面呈現(放大,縮小,關閉等),與用户交互,如前進後退;
    (2)管理各個頁面,負責創建,銷燬其他進程。(如tab頁的新建與關閉);
    (3)網絡資源的管理,下載等。
  2. 第三方插件進程:每種類型的插件只有一個進程,只有當插件運行時才會創建;
  3. GPU進程:最多創建一個,用於3D繪製;
  4. 瀏覽器渲染進程(Renderer進程),內部是多線程的,也是每個標籤頁所擁有的進程,互不影響,負責頁面渲染,js執行,事件處理等。
    每打開一個tab頁都會創建一個Renderer進程,一般幾個空tab頁會合併成一個Renderer進程以節省資源。Renderer是多線程的,接下來學習下各個線程在頁面中的作用。

線程包括:

  1. 圖形用户界面GUI渲染線程
    · 負責構建HTML,css,構建Dom樹,Renderer樹,佈局與繪製等。
    · 當界面需要重繪(repaint)或由於某種操作引發迴流(reflow)時,該線程就會執行;
  2. JS引擎線程
    · JS內核,也稱js引擎(比如Chrome的V8引擎),負責處理執行js腳本。
      · 等待任務隊列任務的到來,然後加以處理,瀏覽器渲染進程無論什麼時候都只有一個js引擎在運行js;
  3. 事件觸發線程
    · 當js引擎執行代碼塊,如setTimeout時(也可以來自其他線程,如鼠標點擊,ajax異步請求等),會將對應任務添加到事件線程中;
    · 當對應的事件符合觸發條件被觸發時,該線程會把事件添加到待處理隊列的隊尾,等待js引擎的處理;
    注: 所有在處理隊列的任務都要等待JS引擎空閒時才會執行。
  4. 定時器觸發線程
    · setTimeout和setInterval所在的線程;
    · 定時任務不是在js引擎線程中進行的(會阻塞js的執行),而是另外開一線程進行計時。
    · 及時完成時,即符合事件觸發條件,後事件觸發線程會把事件添加到大愛處理隊列的隊尾(定時器最小時間間隔為4ms).
  5. 異步http請求線程
    · 在XMLHttpRequest連接後,通過瀏覽器開一個線程請求;
    · 當檢測到狀態變更時,如果設置回調函數,異步線程就會產生狀態變更事件,將這個事件推入到事件隊列的隊尾。

瀏覽器內核進程中各線程的關係

GUI線程和JS引擎線程?
GUI線程負責將DOM渲染到頁面上,JS引擎線程涉及到DOM的一些增刪改的操作。如果兩個線程同時運行,GUI線程渲染DOM的同時,進行一些增刪改的操作,必將造成衝突(渲染結果與DOM操作結果不一致)。因此,這兩個線程設計為互斥的關係。當GUI線程運行時,JS引擎線程處於凍結狀態,同理,JS引擎線程運行時,GUI線程處於凍結狀態。
注: 當JS執行較長時間時,頁面就會出現卡頓現象,所以要儘量避免長時間執行的代碼。

Add a new 評論

Some HTML is okay.