進程是一個具備必定獨立功能的程序在一個數據集上的一次動態執行的過程,是操做系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。算法
咱們這裏將進程比喻爲工廠的車間,它表明CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態。瀏覽器
任務調度採用的是時間片輪轉的搶佔式調度方式,而進程是任務調度的最小單位安全
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元。這裏把線程比喻一個車間的工人,即一個車間能夠容許由多個工人協同完成一個任務。多線程
進程是操做系統分配資源的最小單位,線程是程序執行的最小單位。架構
一個進程由一個或多個線程組成 調度和切換:線程上下文切換比進程上下文切換要快得多。異步
多進程:多進程指的是在同一個時間裏,同一個計算機系統中若是容許兩個或兩個以上的進程處於運行狀態。編輯器
多進程帶來的好處是明顯的,好比你能夠聽歌的同時,打開編輯器敲代碼,編輯器和聽歌軟件的進程之間絲絕不會相互干擾。函數
多線程是指程序中包含多個執行流,即在一個程序中能夠同時運行多個不一樣的線程來執行不一樣的任務,也就是說容許單個程序建立多個並行執行的線程來完成各自的任務。操作系統
跟如今的不少多線程瀏覽器不同,Chrome瀏覽器使用多個進程來隔離不一樣的網頁。所以在Chrome中打開一個網頁至關於起了一個進程線程
爲何多進程:把全部網頁都放進一個進程的瀏覽器面臨響應速度,安全性方面的挑戰。由於若是瀏覽器中的一個tab網頁崩潰的話,將會致使其餘被打開的網頁應用。
爲何不是多線程:由於進程之間是不共享資源和地址空間的,因此不會存在太多的安全問題,而因爲多個線程共享着相同的地址空間和資源,因此會存在線程之間有可能會惡意修改或者獲取非受權數據等複雜的安全問題。
在瞭解這個知識點線,咱們須要先說明下什麼是瀏覽器內核。
瀏覽器內核是多線程,在內核控制下各線程相互配合以保持同步,一個瀏覽器一般由如下常駐線程組成:
GUI 渲染線程
JavaScript引擎線程
定時觸發器線程
事件觸發線程
異步http請求線程
GUI渲染線程
GUI渲染線程:負責渲染瀏覽器界面HTML元素,當界面須要重繪(Repaint)或因爲某種操做引起迴流(reflow)時,該線程就會執行。在Javascript引擎運行腳本期間,GUI渲染線程都是處於掛起狀態的,也就是說被」凍結」了.
Javascript引擎線程:Javascript引擎,也能夠稱爲JS內核,主要負責處理Javascript腳本程序,例如V8引擎。Javascript引擎線程理所固然是負責解析Javascript腳本,運行代碼。
Javascript是單線程的:
JavaScript爲處理頁面中用戶的交互,以及操做DOM樹若是JavaScript是多線程的方式來操做這些UI DOM,則可能出現UI操做的衝突;
GUI 渲染線程 與 JavaScript引擎線程互斥! 因爲JavaScript是可操縱DOM的,若是在修改這些元素屬性同時渲染界面(即JavaScript線程和UI線程同時運行),那麼渲染線程先後得到的元素數據就可能不一致了。所以爲了防止渲染出現不可預期的結果,瀏覽器設置GUI渲染線程與JavaScript引擎爲互斥的關係,當JavaScript引擎執行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到引擎線程空閒時當即被執行。
JS阻塞頁面加載 從上面咱們能夠推理出,因爲GUI渲染線程與JavaScript執行線程是互斥的關係,當瀏覽器在執行JavaScript程序的時候,GUI渲染線程會被保存在一個隊列中,直到JS程序執行完成,纔會接着執行。所以若是JS執行的時間過長,這樣就會形成頁面的渲染不連貫,致使頁面渲染加載阻塞的感受。
定時觸發器線程 瀏覽器定時計數器並非由JavaScript引擎計數的, 由於JavaScript引擎是單線程的, 若是處於阻塞線程狀態就會影響記計時的準確, 所以經過單獨線程來計時並觸發定時是更爲合理的方案。
事件觸發線程 當一個事件被觸發時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件能夠是當前執行的代碼塊如定時任務、也可來自瀏覽器內核的其餘線程如鼠標點擊、AJAX異步請求等,但因爲JS的單線程關係全部這些事件都得排隊等待JS引擎處理。
異步http請求線程 在XMLHttpRequest在鏈接後是經過瀏覽器新開一個線程請求, 將檢測到狀態變動時,若是設置有回調函數,異步線程就產生狀態變動事件放到 JavaScript引擎的處理隊列中等待處理。
每一個進程被分配一個時間段,即容許該進程在該時間段中運行,若是在時間片結束時該進程還在運行,則將剝奪CPU給下一個進程,若是該進程在時間片結束前阻塞或結束,則CPU當即切換
調度算法(批處理、交互式、實時):
前提:預知進入就緒隊列的進程執行時間 原理:假設有4個進程,其運行時間分別爲a,b,c,d,第一個進程在a時刻結束,第二個進程在a+b時刻結束,以此類推,平均週轉時間爲(4a+3b+2c+d)/4,能夠看到a對平均值的影響最大,因此a應該取最小值纔好,這樣平均週轉時間才能取到最小值