進程與線程
1.進程
- 程序的一次執行,它佔有一片獨有的內存空間
- 可以通過windows任務管理器查看進程
2.線程
- 是進程內的一個獨立執行單元
- 是程序運行的一個完整流程
- 是CPU的最小調度單元
如下圖:
3.相關
- 應用程序必須運行在某個進程的某個線程中
- 一個進程中至少有一個運行的線程:主線程,進程啓動後自動創建
- 一個進程中可以同時運行多個線程,程序是多線程運行的
- 一個進程內的數據可以供其中的多個線程直接共享
- 多個進程之間的數據是不能直接共享的
- 線程池(thread pool):保存多個線程對象的容器,實現線程對象的反覆利用
4.相關問題
1).何爲多進程與多線程?
- 多進程:一應用程序可以同時啓動多個實例運行
- 多線程:在一個進程內,同時有多個線程運行
2).比較單線程與多線程?
多線程
優點:
- 能有效提升CPU的利用率
缺點:
- 創建多線程開銷
- 線程間切換開銷
- 死鎖與狀態同步問題
單線程
優點:
- 順序編程簡單易懂
缺點:
- 效率低
3).JS是單線程還是多線程?
- JS是單線程運行的
- 但使用H5中的Web Workers可以多線程運行
4).瀏覽器運行是單線程還是多線程?
- 都是多線程運行的
5).瀏覽器運行是單進程還是多進程?
- 有的是單進程:firefox、老版IE
- 有的是多進程:chrome、新版IE
瀏覽器內核
- 支撐瀏覽器運行的最核心的程序
1.不同瀏覽器的內核可能不同
- Chrome,Safari:webkit
- firefox:Gecko
- IE:Trident
- 360,搜狗等國內瀏覽器:Trident + Webkit
2.內核由很多模塊組成
- js引擎模塊:負責js程序的編譯與運行
- html,css文檔解析模塊:負責頁面文本的解析
- DOM/CSS模塊:負責dom/css在內存中的相關處理
- 佈局和渲染模塊:負責頁面的佈局和效果的繪製(內存中的對象)
- … …
- 定時器模塊:負責定時器的管理
- 事件響應模塊:負責事件的管理
- 網絡請求模塊:負責ajax請求
定時器引發的思考
1.定時器真的是定時執行嗎?
- 定時器並不能保證真正定時執行
- 一般會延遲一丁點(可以接受),也有可能延遲很長時間(不能接受)
2.定時器回調函數是在分線程執行的嗎?
- 在主線程執行的,js是單線程的
3.定時器是如何實現的?
- 事件循環模型
js是單線程執行的
1.如何證明js執行是單線程的?
- setTimeout()的回調函數是在主線程執行的
- 定時器回調函數只有在運行棧中的代碼全部執行完後纔有可能執行
2.爲什麼js要用單線程模式?
- JavaScript的單線程模式,與它的用途有關
- 作爲瀏覽器腳本語言,JavaScript的主要用途是和用戶互動,以及操作DOM
- 因此它只能是單線程的,否則會帶來很複雜的同步問題
js引擎執行代碼的基本流程
- 先執行初始化代碼:包含一些特別的代碼 回調函數(異步執行)
- 設置定時器
- 綁定監聽
- 發送ajax請求
- 後面某個時刻纔會執行回調代碼
事件循環模型
模型原理圖:
1.所有代碼分類
- 初始化執行代碼(同步代碼):包含綁定dom事件監聽,設置定時器,發送ajax請求的代碼
- 回調執行代碼(異步代碼):處理回調邏輯
2.js引擎執行代碼的基本流程:
- 初始化代碼
- 回調代碼
3.模型的2個重要組成部分:
- 事件(定時器/DOM事件/Ajax)管理模塊
- 回調隊列
4.模型的運轉流程
- 執行初始化代碼,將事件回調函數交給對應模塊管理
- 當事件發生時,管理模塊會將回調函數及其數據添加到回調隊列中
- 只有當初始化代碼執行完後(可能要一定時間),纔會遍歷讀取回調隊列中的回調函數執行
H5 Web Workers多線程
Web Workers是HTML5提供的一個JavaScript多線程解決方案。
可以實現將一些大計算量的代碼交由Web Workers運行而不凍結用戶界面,但是子線程完全受主線程控制,且不得操作DOM。所以,這個新的標準並沒有改變JavaScript單線程的本質。
1.相關API
- Worker:構造函數,加載分線程執行的js文件
- Worker.prototype.onmessage:用於接收另一個線程的回調函數
- Worker.prototype.postMessage:向另一個線程發送消息
2.不足
- Worker內代碼不能操作DOM
- 不能跨域加載JS
- 不是每個瀏覽器都支持這個新特性