瀏覽器中的執行緒
1 程序與執行緒的區別
程序是作業系統分配資源的最小單位, 執行緒是程式執行的最小單位
一個程序由一個或多個執行緒組成, 執行緒是一個程序中程式碼的不同執行路線
程序之間相互獨立, 但同一程序下的各個執行緒之間共享程式的記憶體空間(包括程式碼段,資料集, 堆等)以及一些程序
級的資源(如開啟檔案和訊號)
排程和切換:執行緒上下文切換比程序上下文切換要快得多
2 多程序與多執行緒
多程序: 指在同一時間內, 同一個計算機系統中如果允許兩個或兩個以上的程序處於執行狀態
eg: 在聽歌的同時, 開啟編輯器寫程式碼, 這兩個程序之間不會相互干擾
多執行緒: 程式中包含多個執行流, 在一個程式中可以同時執行多個不同的執行緒執行不同的任務,
允許單個程式建立多個並行執行的執行緒完成各自的任務
3 瀏覽器多程序架構
chrome多程序架構的原因: 如果一個程序處理多個網頁, 面臨健壯性, 響應速度, 安全性
一個tab網頁崩潰會導致其他網頁崩潰,程序之間是不共享資源和地址空間的, 不會存在太多的
安全問題, 由於多個執行緒共享資源,會存線上程之間可能會惡意修改 或獲取非授權資料
4 瀏覽器核心
通過取得頁面內容, 整理資訊(應用CSS),計算 和 組合最終輸出視覺化的影象的結果
chrome瀏覽器為每個tab頁面單獨啟用程序, 因此每個tab網頁都有獨立的渲染引擎例項
5 js 是單執行緒的原因
如果js是多執行緒 就會遇到同一個DOM元素, 一個執行緒負責修改, 一個執行緒負責刪除, 這時候需要瀏覽器來裁決哪個執行緒的執行結果生效,為了避免加鎖造成更多的複雜性, js選擇了單執行緒。
6 瀏覽器常駐執行緒
GUI渲染執行緒
js引擎執行緒
定時觸發器執行緒
事件觸發執行緒
非同步http請求執行緒
a: GUI渲染執行緒
負責渲染瀏覽器介面的HTML元素, 當介面需要重繪或由於某種操作引發迴流(reflow),該執行緒就會執行, 當js 引擎執行指令碼期間, GUI 渲染執行緒處於掛起狀態的, 也就是 凍結 狀態
b: JS引擎執行緒
處理js指令碼程式, 負責解析js指令碼, 執行程式碼
c: GUI執行緒與js引擎執行緒互斥原因
由於js是可操作DOM的, 如果在修改這些元素屬性同時渲染介面, 渲染執行緒前後獲得的元素資料就可能不一致, 防止渲染出現不可預期的結果【個人覺得原因是js可以修改dom節點, 渲染dom節點後, 執行js程式碼,再次渲染dom節點,前一次的渲染屬於浪費】所以瀏覽器設定GUI執行緒與js執行緒引擎為互斥的關係
d: 定時觸發器執行緒
瀏覽器定時計數器並不是 js引擎計數的, 因為js引擎是單執行緒的, 如果處於阻塞執行緒狀態就會影響計時的準確性, 單獨執行緒來計時並觸發定時更為合理的方案
e: 事件觸發執行緒
當一個事件被觸發時該執行緒會把事件新增到待處理佇列的隊尾,等待js引擎處理,這些事件可以是當前執行的程式碼塊如 定時任務, 也可以來自瀏覽器核心的其他執行緒如 滑鼠點選, ajax非同步請求, 但由於js的單執行緒關係所有這些事件都需要排隊等待js引擎處理
f: 非同步http請求執行緒
在xmlhttpRequest連線後是通過瀏覽器新開一個執行緒請求, 將檢測到狀態變更時, 如果設定有回撥函式, 非同步執行緒就產生狀態變更事件放到js引擎的處理佇列中等待處理
事件和回撥函式
任務佇列 是一個事件的佇列,IO裝置完成一項任務,就在 任務佇列中新增一個事件,表示相關的非同步任務可以進入
執行棧了,
就是說 當前非同步任務完成後 才會將回調函式新增 任務佇列中,等待主執行緒讀取