06------線程機制與事件機制

進程與線程

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
  • 不是每個瀏覽器都支持這個新特性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章