瀏覽器是多進程,包含那些進程
- browser進程
- GPU進程
- 插件進程
- 瀏覽器渲染進程(即瀏覽器的內核,每個Tab也就是一個進程)
browser進程作用
- 負責瀏覽器界面的顯示,用戶的交互,前進后退等
- 負責管理各個頁面,創建以及銷毀
- 負責網絡資源的管理和下載
輸入URL主進程(browser)做了什么
- 查詢過程 1 主進程的UI線程判斷輸入的是URL還是query; 2 UI線程通知storage線程,查瀏覽器緩存(緩存機制) 3 不用緩存,那么發送請求,那么UI線程通知網絡線程,獲取網頁內容,并控制tab頁表示加載中 4 網絡線程執行dns查詢,隨后建立起TSL連接
- 響應 5 當響應返回的時候,網絡線程根據content-type和MIME類型判斷 6 如果為HTML,那么將數據傳給渲染進程 7 渲染進程開始解析渲染
渲染進程
渲染進程包含那些?
GUI線程
js引擎線程
定時器線程
異步請求線程
- 最終的圖
GUI:二進制的位圖
browser: 位圖棧格化
GPU: 產生最終的composite交給顯示器
v8引擎(Render進程)
- GUI渲染線程
- 事件處理線程
- 定時器線程(SetTimeout..)
- HTTP線程
- js引擎線程
GUI渲染線程和js引擎互斥 https://www.yuque.com/mty/here/qy3e42
- js引擎線程
即主線程,執行完就和事件線程通信
讀取任務隊列事件,執行
- GUI線程
? 負責頁面渲染,解析 HTML CSS ,構建 DOM 樹,進行布局和繪制
? 重繪和回流會執行
? GUI 線程與 JS 引擎互斥
- 事件觸發線程
鼠標點擊,異步請求等的回調放入的事件隊列就是事件觸發線程管理的事件隊列
掌管者事件隊列
事件任務隊列分為: 宏任務隊列,微任務隊列
執行順序: 宏任務(1個)--> 微任務(所有事件)
- http線程
在XMLHttpRequest在連接后是通過瀏覽器新開一個線程請求
將檢測到狀態變更(輪詢)時,如果設置有回調函數,
異步線程就產生狀態變更事件,將這個回調再放入事件隊列中。再由JavaScript引擎執行。
管理異步請求和回調函數,異步任務有結果后,把他放進任務隊列
但是下載資源還是由瀏覽器的下載線程執行的
- 定時器線程
setTimeout的時候,開啟定時器線程,用來計時
滿足條件后,把事件(回調函數)推進任務隊列中
不單獨開啟這個線程,就會阻塞主線程