一 概念
1.程式類似於工廠,有自己獨立的資源(記憶體)。
2. 執行緒類似於工廠中的工人,多個工人之間協同合作,共享記憶體。
3. event loop:事件迴圈 stack:棧 heap:堆 callback queue:回撥佇列(事件佇列)
4. 瀏覽器包括的程式有:主程式,GPU程式(3D繪製),外掛程式,渲染程式。
5. 瀏覽器的渲染程式,也就是瀏覽器的核心,負責頁面渲染,指令碼執行,事件處理等等,其內部是多執行緒的。包括GUI渲染執行緒,js引擎執行緒,事件觸發執行緒,定時器觸發執行緒,非同步http請求執行緒等等。
6.渲染程式中各執行緒的作用:GUI執行緒負責渲染頁面,解析html,css,構建dom樹,佈局和繪製頁面;js引擎執行緒也是主執行緒,負責執行js指令碼;事件觸發執行緒歸屬於瀏覽器執行緒,負責事件監聽等事件執行(可以理解為事件佇列);定時器執行緒也就是setInterval和setTimeout所在的執行緒;非同步http請求執行緒負責XMLHttpRequest請求;其中渲染執行緒和js引擎執行緒是互斥的,也就是說這兩個執行緒不能同時執行,這也解釋了為什麼過長的js指令碼執行會阻塞頁面的渲染。
二 js執行原理(解釋為什麼js是單執行緒,還可以非同步執行任務)
js程式碼會在js引擎的執行棧中以單執行緒的方式執行。而所有I/O或者定時任務等等非同步程式碼會通過執行環境(瀏覽器)中的其他執行緒非同步執行,並將回撥函式(執行結果)放在回撥佇列(callback queue)中等待被呼叫。當執行棧中沒有可執行程式碼時,通過事件迴圈(event loop)檢查並取出事件佇列中的第一個事件執行。