1. 程式人生 > >瀏覽器中的執行緒

瀏覽器中的執行緒

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裝置完成一項任務,就在 任務佇列中新增一個事件,表示相關的非同步任務可以進入

執行棧了, 

就是說  當前非同步任務完成後  才會將回調函式新增  任務佇列中,等待主執行緒讀取