瀏覽器是多線程的(多進程)
- 每創建了一個Tab頁。就相當於一個獨立的瀏覽器進程。(瀏覽器的優化,一些進程被合併了)
- 瀏覽器能運行:是因爲系統給它的進程分配了資源(cpu和內存)
瀏覽器有哪些進程
- 瀏覽器主控進程(負責協調)
- 第三方插件進程(使用插件時使用)
- GPU進程瀏覽器(3D繪製)
- 渲染進程(負責協調、腳本執行、事件處理)
爲什麼不是進程?
- 一個崩潰影響整個進程。
4.最主要的是渲染進程:它是多線程的。
- GUI渲染線程:負責渲染解析html樹,css樹,構建dom樹和渲染樹。佈局繪製。他與js線程是互斥的,js執行時,gui會被掛起,gui會等待js引擎爲空時立即執行。
- JS引擎線程:負責處理js腳本。Js執行時間過長,會導致頁面渲染不連貫。一個tab頁無論如何只有一個js線程在執行js程序。
- 事件觸發線程:歸屬於瀏覽器,而不是js引擎。用來控制循環(理解爲瀏覽器忙不過來)。當JS引擎執行代碼塊如setTimeout(異步任務)時。線程會把事件添加到隊列末尾,等待js引擎處理。
- 定時觸發線程:計時器不是由js引擎計數的,添加到事件隊列中,通過線程計時,當計時完畢後,添加到事件隊列中。等待js引擎空閒時處理。
- 異步http請求。Xmlhttprequset連接後,會通過先開一個線程請求,檢測到狀態變更時,將回調放入事件隊列裏。由js引擎處理。
瀏覽器進程和瀏覽器內核的通信過程。
- 首先
瀏覽器進程
獲取用戶請求,首先需要獲取頁面內容(比如通過網絡下載資源)。隨後將該任務通過接口傳給渲染進程
,然後開始渲染。 渲染進程
接的接口收到信息。交給渲染線程
,然後開始渲染。渲染線程
開始渲染頁面,這其間可能借助瀏覽器進程
獲取資源,GPU來幫助渲染。最後渲染進程
把結果傳給瀏覽器進程
。瀏覽器進程
收到結果並將結果繪製出來。
爲什麼互斥js引擎和gui渲染線程?
- 防止元素數據前後不一樣。