做一個好前端必須要知道的事——瀏覽器的線程與進程

瀏覽器是指chrome,沒心情關心其他的

進程和線程

直接上總結,想深入理解的可以查閱文末的鏈接

  • 進程是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體
  • 線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位
  • 一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間),而進程之間相互獨立
  • 不同進程之間也可以通信,chrome是通過IPC(Inter-Process Communication),這是Google搭的一套進程間通信的機制

也有一個比喻用來理解他們之間的關係

  • 工廠的資源 => 系統分配的內存(獨立的一塊內存)
  • 工廠之間的相互獨立 => 進程之間相互獨立
  • 多個工人協作完成任務 => 多個線程在進程中協作完成任務
  • 工廠內有一個或多個工人 => 一個進程由一個或多個線程組成
  • 工人之間共享空間 => 同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)

瀏覽器的多進程

瀏覽器是多進程的,主要有

  • Browser進程:瀏覽器的主進程(負責協調、主控),只有一個。作用有:

    • 負責瀏覽器界面顯示,與用戶交互。如前進,後退等
    • 負責各個頁面的管理,創建和銷燬其他進程
    • 將Renderer進程得到的內存中的Bitmap,繪製到用戶界面上
    • 網絡資源的管理,下載等
  • 第三方插件進程:每種類型的插件對應一個進程,僅當使用該插件時才創建
  • GPU進程:最多一個,用於3D繪製等
  • Renderer進程:默認每個Tab頁面對應一個進程(具體可以看這裏

Renderer進程

該進程(可以理解爲一個tab頁面實例)的主要線程有

  • GUI渲染線程,負責渲染瀏覽器界面,解析HTML,CSS,構建DOM樹和RenderObject樹,佈局和繪製等。當界面需要重繪(Repaint)或由於某種操作引發迴流(reflow)時,該線程就會執行
  • JS引擎線程,也稱爲JS內核,負責處理Javascript腳本程序,運行代碼。
  • 事件觸發線程,歸屬於瀏覽器而不是JS引擎,用來控制事件循環(JS引擎是等代碼到來,然後執行)
  • 定時觸發器線程,傳說中的setInterval與setTimeout所在線程,瀏覽器定時計數器並不是由JavaScript引擎計數的(因爲JavaScript引擎是單線程的, 如果處於阻塞線程狀態就會影響記計時的準確)
  • 異步http請求線程,在XMLHttpRequest在連接後是通過瀏覽器新開一個線程請求,將檢測到狀態變更時,如果設置有回調函數,異步線程就產生狀態變更事件,將這個回調再放入事件隊列中。再由JavaScript引擎執行。

此文比較羞澀,都是概念總結,但想做一個好前端卻也必須要知道,不過也不必太深究😄,由此引出下面的文章可能會更有價值,歡迎關注
下一篇文章講 做一個好前端必須要知道的事——頁面渲染

參考

編程思想之多線程與多進程(1)——以操作系統的角度述說線程與進程
從瀏覽器多進程到JS單線程,JS運行機制最全面的一次梳理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章