瀏覽器的進程與線程詳解

進程

進程是cpu的資源分配的最小單位。瀏覽器

多進程:多進程指的是在同一個時間裏,同一個計算機系統中若是容許兩個或兩個以上的進程處於運行狀態。多進程帶來的好處是明顯的,好比你能夠聽歌的同時,打開編輯器敲代碼,編輯器和聽歌軟件的進程之間絲絕不會相互干擾。服務器

瀏覽器是多進程的,瀏覽器的進程主要包括如下幾種:

  1. Browser進程:瀏覽器的主進程(負責協調,主控)
  2. 第三方插件進程:每種類型的插件對應一個進程,僅當使用該插件時才建立
  3. GPU進程:最多一個,用於3D繪製
  4. 瀏覽器渲染進程(內核):默認每一個Tab頁面一個進程,互不影響,控制頁面渲染,腳本執行,事件處理等(有時候會優化,如多個空白tab會合併成一個進程)

在瀏覽網頁時,同時打開幾個新的頁面, 這就要打開幾個瀏覽窗口,但一旦開啓十幾個窗口,整個計算機就會愈來愈慢。網絡


多進程瀏覽器的優勢

  • 避免頁面渲染影響整個瀏覽器
  • 避免第三方插件影響整個瀏覽器
  • 多進程充分利用多核優點
  • 方便使用沙盒模型隔離插件等進程,提升瀏覽器穩定性

通俗的講,就是用戶打開多個窗口,若是其中一個窗口崩掉了,也不會影響整個瀏覽器,其餘的界面照樣正常運行多線程

線程

  • 一個進程由一個或多個線程組成,線程是一個進程中代碼的不一樣執行路線;
  • 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源(如打開文件和信號)。

瀏覽器的渲染進程(瀏覽器內核),是多線程的,主要如下幾大類:

  1. GUI線程
  2. Javascript引擎線程
  3. 事件觸發線程
  4. 定時器線程
  5. 網絡請求線程

GUI線程

負責渲染瀏覽器界面HTML元素,當界面須要重繪(Repaint)或因爲某種操做引起迴流(reflow)時,該線程就會執行。在Javascript引擎運行腳本期間,GUI渲染線程都是處於掛起狀態的,也就是說被」凍結」了.異步

Javascript引擎線程

也能夠稱爲JS內核,主要負責處理Javascript腳本程序,例如V8引擎。Javascript引擎線程理所固然是負責解析Javascript腳本,運行代碼。編輯器

Javascript是單線程的

這是由於Javascript這門腳本語言誕生的使命所致:JavaScript爲處理頁面中用戶的交互,以及操做DOM樹、CSS樣式樹來給用戶呈現一份動態而豐富的交互體驗和服務器邏輯的交互處理。若是JavaScript是多線程的方式來操做這些UI DOM,則可能出現UI操做的衝突; 若是Javascript是多線程的話,在多線程的交互下,處於UI中的DOM節點就可能成爲一個臨界資源,假設存在兩個線程同時操做一個DOM,一個負責修改一個負責刪除,那麼這個時候就須要瀏覽器來裁決如何生效哪一個線程的執行結果。固然咱們能夠經過鎖來解決上面的問題。但爲了不由於引入了鎖而帶來更大的複雜性,Javascript在最初就選擇了單線程執行。函數

GUI 渲染線程 與 JavaScript引擎線程互斥!

因爲JavaScript是可操縱DOM的,若是在修改這些元素屬性同時渲染界面(即JavaScript線程和UI線程同時運行),那麼渲染線程先後得到的元素數據就可能不一致了。所以爲了防止渲染出現不可預期的結果,瀏覽器設置GUI渲染線程與JavaScript引擎爲互斥的關係,當JavaScript引擎執行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到引擎線程空閒時當即被執行。優化

JS阻塞頁面加載

因爲GUI渲染線程與JavaScript執行線程是互斥的關係,當瀏覽器在執行JavaScript程序的時候,GUI渲染線程會被保存在一個隊列中,直到JS程序執行完成,纔會接着執行。所以若是JS執行的時間過長,這樣就會形成頁面的渲染不連貫,致使頁面渲染加載阻塞的感受。插件

定時觸發器線程

瀏覽器定時計數器並非由JavaScript引擎計數的, 由於JavaScript引擎是單線程的, 若是處於阻塞線程狀態就會影響記計時的準確, 所以經過單獨線程來計時並觸發定時是更爲合理的方案。線程

事件觸發線程

當一個事件被觸發時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件能夠是當前執行的代碼塊如定時任務、也可來自瀏覽器內核的其餘線程如鼠標點擊、AJAX異步請求等,但因爲JS的單線程關係全部這些事件都得排隊等待JS引擎處理。

異步http請求線程

在XMLHttpRequest在鏈接後是經過瀏覽器新開一個線程請求, 將檢測到狀態變動時,若是設置有回調函數,異步線程就產生狀態變動事件放到 JavaScript引擎的處理隊列中等待處理。

相關文章
相關標籤/搜索