[toc]
#### 進程和線程
+ 程序
被cpu執行的代碼,程序存儲在磁盤上
+ 進程
在內存中運行的程序,cpu資源分配的最小單位
+ 線程
一個進程可以有多個線程,線程是cpu調度的最小單位
#### 瀏覽器包含哪些進程
每次打開一個tab,相當于創建了一個獨立的瀏覽器進程
1. Browser進程:瀏覽器主進程
+ 負責瀏覽器的界面顯示,用戶交互,前進后退等
+ 負責各個頁面的管理,創建和銷毀
+ 網絡資源的管理,下載
2. 瀏覽器渲染進程(瀏覽器內核進程)
+ 瀏覽器渲染進程內部是多線程的
+ 頁面渲染,腳本執行,事件處理
3. 第三方插件進程:僅當插件使用時創建
4. GPU進程:最多一個,用于3D繪制
5. SharedWorker進程:webWorker屬于渲染進程中的一個線程,是為當前tab進程解析js,而SahredWorker為所有的tab提供
#### 瀏覽器渲染進程
渲染進程是多線程的
1. GUI渲染線程
+ 渲染界面,解析html, css, 構建dom樹和renderObject樹,布局和繪制
+ 重繪和回流會觸發渲染線程
+ GUI渲染線程和js引擎線程是互斥的,當js引擎執行時,gui線程會被掛起,gui更新會被保存在一個隊列里,等到js引擎空閑時執行
2. JS引擎線程
+ 也稱js內核,處理javascripts腳本程序, v8引擎
+ 負責解析javascript腳本,運行代碼
+ 一個tab頁中永遠只有一個js線程在運行js程序
+ js引擎線程會造成gui渲染線程的掛起,阻塞加載
3. 事件觸發線程
+ 歸屬于瀏覽器,而不是js引擎,用來控制事件循環
+ 當js引擎執行代碼塊,如setTimeOut,鼠標點擊,ajax異步請求時,會將對應的任務添加到事件線程中
+ 當對應的事件符合觸發條件時,會被事件線程添加到待處理隊列的隊尾,等待js引擎的處理
4. 定時器線程
+ setInterval和setTimeout所在線程
+ js引擎解析到setTimeout的時候,會交給定時器線程處理,等到計時完畢后,添加到事件隊列中
5. 異步http請求線程
+ 在XMLHttpRequest在連接后通過瀏覽器新開了一個線程請求
+ 檢測到狀態變更時,如果存在回調函數,異步線程就會產生狀態變更事件,將這個回調函數放到事件隊列中。再有js引擎執行
6. WebWorker線程
#### GUI渲染線程和JS引擎線程為什么互斥?
由于js可以操作dom,如果修改dom的同時渲染界面,那么有可能出現渲染線程前后獲得的元素數據不一致
#### WebWorker
+ js引擎向瀏覽器申請開一個子線程(worker線程)執行js文件,這個子線程不是js引擎線程,所以不能操作dom
+ js引擎線程與worker線程通過postMessage API通信,worker線程不會阻塞js引擎主線程,也不會阻塞GUI線程,所以不會阻塞dom和js
#### 瀏覽器渲染流程-renderer進程/渲染進程
1.解析html,構建dom樹
2.解析css,結合dom樹構建render樹
3.布局render樹,計算元素的尺寸和位置 layout
4.繪制render樹,繪制頁面像素信息 painting
5.瀏覽器將各層的信息發送給gpu,gpu將各層合成,顯示在屏幕上
#### 普通圖層和復合圖層
absolute和fixed雖然可以脫離文檔流,但任然屬于默認復合層
硬件加速will-change,可以單獨分配資源,會在上面添加一個新的復合圖層,這個里面的變化不會影響外界的重繪重排
#### 從Event Loop談js的運行機制
js引擎是單線程的,在執行過程中會遇到setTimeout,promise等異步異步任務
- JavaScript
- 1. DOM事件流
- 2. 模擬 new, Object create(), bind
- 5. 封裝函數進行字符串駝峰命名的轉換
- 6. 什么是promise
- 7. 判斷一個數是否為數組
- 10. __proto__和prototype以及原型,原型鏈,構造函數
- 11. 繼承
- 12. 閉包
- 13. 回調函數
- 14. var 和 let 區別
- 15. this、bind、call、apply
- 16.undefined和null的區別
- 17.內存泄漏
- 18.垃圾回收機制
- html css
- 1. 元素垂直水平居中
- 2. 清除浮動
- 3. bootstrap柵格系統
- 4. px rpx em rem vw 的區別
- 5. 兩種盒子模型
- 6. 合集
- web類
- 1. html5的新特性以及理解(web標簽語義化)
- 2. 什么是路由,關于前端路由和后端路由
- 3. 對優質代碼的理解
- 4. cookie 和 sessionStorage和localStorage
- 5. 瀏覽器內核
- 6. http 狀態碼
- 7. href 和 src 的區別
- 8. link 和 @import 的區別
- 9. http 狀態碼
- 10. websocket
- 11. 瀏覽器解析url
- 12.http緩存
- vue
- 1.vue2和vue3有哪些區別
- 1. 對 mvvvm 的理解
- 2. mvvm的優缺點
- 3. 數據雙向綁定的原理
- 4. 生命周期
- 5. 組件如何通信
- 6. computed和watch的區別
- 7. proxy 和 Object.defineProperty
- 8. 虛擬dom和 diff算法
- 9. 路由的嵌套與傳參
- 10. 路由導航鉤子
- 11. axios 的理解
- 12. vue自定義指令 diretive
- 13. diff 的實現
- 14. 實現一個簡單的雙向綁定
- 15. 為什么 data 是一個函數
- 題譜
- js
- 手寫篇
- css
- vue
- react
- 算法
- 自我介紹
- 八股文
- 源項目地址
- 1.計算機網絡
- 2.瀏覽器
- 3.html和css
- 4.javascript
- 6.typescript
- 7.vue
- 8.react
- 大廠面試
- 面試題大全
- 常見性能優化
- 面試實戰
- 面試分析
- 押題
- 1.微前端在項目中的實際應用
- 2.性能優化
- vue相關
- 1.說一說HashRouter和HistoryRouter的區別和原理
- 無敵之路,牛客網面試題自測記錄
- 前端基礎
- 1.html
- 2.js基礎
- 珠峰性能優化
- WebWorker
- url到渲染
- 瀏覽器加載機制
- 自我介紹1
- 手寫題
- 1.compose
- 2.setTimeout模擬setInterval
- 3.手寫數組拍平
- 4.手寫promise.all
- 5.手寫深拷貝
- webpack
- 實戰