1. 程式人生 > >做一個好前端必須要知道的事——瀏覽器的執行緒與程序

做一個好前端必須要知道的事——瀏覽器的執行緒與程序

瀏覽器是指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引擎執行。

此文比較羞澀,都是概念總結,但想做一個好前端卻也必須要知道,不過也不必太深究