瀏覽器的進程和線程
前言
要理解瀏覽器的進程和線程,首先需要理解一句話:進程是CPU分配資源的最小單位,線程是CPU調度的最小單位。
應用程序在運行時,CPU會分配一塊可獨立運行的內存,即進程,他是應用程序運行的載體。進程一般由程序,數據集合和進程控制塊三部分組成。程序用於描述進程要完成的功能,是控制進程執行的指令集;數據集合是程序在執行時所需要的數據和工作區;程序控制塊包含進程的描述信息和控制信息,是進程存在的唯一標誌;
線程是一種比進程還小的抽象,在早期的操作系統中並沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位,他相當於一個進程只有一個線程,進程本身就是線程。所以線程有時被稱為輕量級進程。
後來,隨着計算機的發展,對多個任務之間上下文切換的效率要求越來越高,就抽象出一個更小的概念--線程,一般一個進程會有多個線程。線程的特點是:線程廉價,線程之間切換的花銷較小,啓動和退出較快,對系統資源的衝擊也比較小。
對於進程和線程有一個通俗的比喻:進程就像一個工廠,線程就像工廠中的員工,工廠與工廠之間相互獨立,工廠中的員工相互協作完成任務,每個工廠至少都有一個員工,員工之間共享工廠的空間。
這段話對應的是:
- 工廠=進程=cpu分配的一塊可獨立運行的內存;
- 進程與進程之間相互獨立;
- 進程中至少有一個線程;
- 進程中的所有線程共享同一空間;
- 進程中的線程相互協作;
瞭解了進程和線程,現在具體瞭解下瀏覽器的進程和線程;
瀏覽器運行時會創建相關進程:
- Browser進程,是瀏覽器的主進程,負責協調,主控,只有一個進程,瀏覽器打開時會創建這個進程;
作用:
(1)負責瀏覽器頁面呈現(放大,縮小,關閉等),與用户交互,如前進後退;
(2)管理各個頁面,負責創建,銷燬其他進程。(如tab頁的新建與關閉);
(3)網絡資源的管理,下載等。 - 第三方插件進程:每種類型的插件只有一個進程,只有當插件運行時才會創建;
- GPU進程:最多創建一個,用於3D繪製;
- 瀏覽器渲染進程(Renderer進程),內部是多線程的,也是每個標籤頁所擁有的進程,互不影響,負責頁面渲染,js執行,事件處理等。
每打開一個tab頁都會創建一個Renderer進程,一般幾個空tab頁會合併成一個Renderer進程以節省資源。Renderer是多線程的,接下來學習下各個線程在頁面中的作用。
線程包括:
- 圖形用户界面GUI渲染線程
· 負責構建HTML,css,構建Dom樹,Renderer樹,佈局與繪製等。
· 當界面需要重繪(repaint)或由於某種操作引發迴流(reflow)時,該線程就會執行; - JS引擎線程
· JS內核,也稱js引擎(比如Chrome的V8引擎),負責處理執行js腳本。
· 等待任務隊列任務的到來,然後加以處理,瀏覽器渲染進程無論什麼時候都只有一個js引擎在運行js; - 事件觸發線程
· 當js引擎執行代碼塊,如setTimeout時(也可以來自其他線程,如鼠標點擊,ajax異步請求等),會將對應任務添加到事件線程中;
· 當對應的事件符合觸發條件被觸發時,該線程會把事件添加到待處理隊列的隊尾,等待js引擎的處理;
注: 所有在處理隊列的任務都要等待JS引擎空閒時才會執行。 - 定時器觸發線程
· setTimeout和setInterval所在的線程;
· 定時任務不是在js引擎線程中進行的(會阻塞js的執行),而是另外開一線程進行計時。
· 及時完成時,即符合事件觸發條件,後事件觸發線程會把事件添加到大愛處理隊列的隊尾(定時器最小時間間隔為4ms). - 異步http請求線程
· 在XMLHttpRequest連接後,通過瀏覽器開一個線程請求;
· 當檢測到狀態變更時,如果設置回調函數,異步線程就會產生狀態變更事件,將這個事件推入到事件隊列的隊尾。
瀏覽器內核進程中各線程的關係
GUI線程和JS引擎線程?
GUI線程負責將DOM渲染到頁面上,JS引擎線程涉及到DOM的一些增刪改的操作。如果兩個線程同時運行,GUI線程渲染DOM的同時,進行一些增刪改的操作,必將造成衝突(渲染結果與DOM操作結果不一致)。因此,這兩個線程設計為互斥的關係。當GUI線程運行時,JS引擎線程處於凍結狀態,同理,JS引擎線程運行時,GUI線程處於凍結狀態。
注: 當JS執行較長時間時,頁面就會出現卡頓現象,所以要儘量避免長時間執行的代碼。