首頁  >  文章  >  web前端  >  瀏覽器的進程與線程的介紹

瀏覽器的進程與線程的介紹

不言
不言轉載
2018-11-17 16:29:361845瀏覽

這篇文章帶給大家的內容是關於瀏覽器的進程與線程的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

行程

行程是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引擎的處理佇列中等待處理。

以上是瀏覽器的進程與線程的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除