進程是操做系統分配資源和調度任務的基本單位
線程是創建在進程上的一次程序運行單位
一個進程上能夠有多個線程
複製代碼
1) 用戶界面-包括地址欄、前進/後退按鈕、書籤菜單等
2) 瀏覽器引擎-在用戶界面和呈現引擎之間傳送指令(瀏覽器的主進程)
3) 渲染引擎,也被稱爲瀏覽器內核(瀏覽器渲染進程)
4) 一個插件對應一個進程(第三方插件進程)
5) GPU提升網頁瀏覽的體驗(GPU進程)
複製代碼
渲染引擎
渲染引擎內部是多線程的,包含: ui線程 js線程 且二者是互斥的
由於JS運行結果會影響到ui線程的結果;
ui更新會被保存在隊列中等到js線程空閒時當即被執行。
複製代碼
js單線程(主線程)
javascript在最初設計時設計成了單線程,爲何不是多線程呢?
若是多個線程同時操做DOM那豈不會很混亂?
這裏所謂的單線程指的是主線程是單線程的,因此在Node中主線程依舊是單線程的。
複製代碼
其餘線程
1) 瀏覽器事件觸發線程(用來控制事件循環,存放setTimeout、瀏覽器事件、ajax的回調函數)
2) 定時觸發器線程(setTimeout定時器所在線程)
3) 異步HTTP請求線程(ajax請求線程)
複製代碼
1) 1.全部同步任務都在主線程上執行,造成一個執行棧
2) 主線程以外,還存在一個任務隊列。只要異步任務有了運行結果,就在任務隊列之中放置一個事件。
3) 一旦執行棧中的全部同步任務執行完畢,系統就會讀取任務隊列,將隊列中的事件放到執行棧中依次執行
4) 主線程從任務隊列中讀取事件,這個過程是循環不斷的
複製代碼
1) 咱們寫的js代碼會交給v8引擎進行處理
2) 代碼中可能會調用nodeApi,node會交給libuv庫處理
3) libuv經過阻塞i/o和多線程實現了異步io
4) 經過事件驅動的方式,將結果放到事件隊列中,最終交給咱們的應用。
複製代碼
同步和異步關注的是消息通知機制javascript
1) 同步就是發出調用後,沒有獲得結果以前,該調用不返回,一旦調用返回,就獲得返回值了。 簡而言之就是調用者主動等待這個調用的結果
2) 而異步則相反,調用者在發出調用後這個調用就直接返回了,因此沒有返回結果。換句話說當一個異步過程調用發出後,調用者不會馬上獲得結果,而是調用發出後,被調用者經過狀態、通知或回調函數處理這個調用。
複製代碼
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.java
1) 阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
2) 非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。
複製代碼
同步異步取決於被調用者,阻塞非阻塞取決於調用者node
1) 同步阻塞
2) 異步阻塞
3) 同步非阻塞
4) 異步非阻塞
複製代碼
任務可分爲宏任務和微任務ajax
1) macro-task(宏任務): setTimeout, setInterval, setImmediate, I/O MessageChannel
2) micro-task(微任務): process.nextTick,
原生Promise(有些實現的promise將then方法放到了宏任務中);
Object.observe(已廢棄), MutationObserver
複製代碼
當應用程序須要處理大量併發的I/O操做,而在向客戶端響應以前,應用程序並不須要進行很是複雜的處理。promise
1) 聊天服務器
2) 電子商務網站
複製代碼