為什么說js是單線程?


為了搞清楚這個問題,我們需要先了解這幾個東西:

1.什么是線程?什么是進程?他們之間的關系?

2.什么是任務隊列( Event Queue ),任務分類(宏任務、微任務)?

3.什么是事件循環?

4.為什么說js是單線程?

5.為什么js要是單線程?

接下來我們一起來看一下:

1.什么是線程?什么是進程?他們之間的關系?

線程定義:線程是CPU調度的最小單位

進程定義:進程是資源分配的最小單位

抽象不太容易理解,但是有兩個關鍵詞:CPU調度、資源分配

背景:一個系統中,有很多進程,它們都會使用內存。為了確保內存不被別人使用,每個進程所能訪問的內存都是圈好的。一人一份,誰也不干擾誰,進程需要管理好它的資源;線程作為進程的一部分,扮演的角色就是怎么利用中央處理器去運行代碼。這其中牽扯到的最重要資源的是中央處理器和其中的寄存器,和線程的棧(stack)。這里想強調的是,線程關注的是中央處理器的運行,而不是內存等資源的管理。

總結一下,通過計算機操作系統的角度出發的。進程和線程不是同一個層面上的概念,線程是進程的一部分,線程主抓中央處理器執行代碼的過程,其余的資源的保護和管理由整個進程去完成。

2.什么是任務隊列( Event Queue ),任務分類(宏任務、微任務)?

定義:所有的任務可以分為同步任務異步任務,同步任務,顧名思義,就是立即執行的任務,同步任務一般會直接進入到主線程中執行;而異步任務,就是異步執行的任務,比如ajax網絡請求,setTimeout 定時函數等都屬於異步任務,異步任務會通過任務隊列的機制(先進先出的機制)來進行協調。

異步任務分類:宏任務(macro-task)和微任務(micro-task)。

執行順序:如果微任務列表里面有任務 會執行完畢后在執行宏任務。

宏任務主要包含:script( 整體代碼)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 環境)

微任務主要包含:Promise、MutaionObserver、process.nextTick(Node.js 環境)

演示代碼如下:

// 這是一個同步任務
console.log('1')            --------> 直接被執行
                                      目前打印結果為:1

// 這是一個宏任務
setTimeout(function () {    --------> 整體的setTimeout被放進宏任務列表
  console.log('2')                    目前宏任務列表記為【s2】
});

new Promise(function (resolve) {
  // 這里是同步任務
  console.log('3');         --------> 直接被執行
  resolve();                          目前打印結果為:1、3
  // then是一個微任務
}).then(function () {       --------> 整體的then[包含里面的setTimeout]被放進微任務列表
  console.log('4')                    目前微任務列表記為【t45】
  setTimeout(function () {
    console.log('5')
  });
});

執行結果為:1、3、4、2、5

3.什么是事件循環?

定義:主線程內的任務執行完畢為空,會去任務隊列讀取對應的任務,推入主線程執行。 不斷重復的過程就是我們說的 Event Loop (事件循環)。

4.為什么說js是單線程?

瀏覽器是多進程的,瀏覽器每一個 tab 標簽都代表一個獨立的進程,其中瀏覽器渲染進程(瀏覽器內核)屬於瀏覽器多進程中的一種,主要負責頁面渲染,腳本執行,事件處理等
其包含的線程有:GUI 渲染線程(負責渲染頁面,解析 HTML,CSS 構成 DOM 樹)、JS 引擎線程、事件觸發線程、定時器觸發線程、http 請求線程等主要線程。

主線程:也就是 js 引擎執行的線程,這個線程只有一個,頁面渲染、函數處理都在這個主線程上執行。

工作線程:也稱幕后線程,這個線程可能存在於瀏覽器或js引擎內,與主線程是分開的,處理文件讀取、網絡請求等異步事件。

可以看出,異步操作都是放到事件循環隊列里面,等待主執行棧來執行的,並沒有專門的異步執行線程,所以說js是單線程

5.為什么js要是單線程?

js設計為單線程還是跟他的用途有關,試想一下 如果js設計為多線程 那么同時修改和刪除同一個dom 瀏覽器又該如何執行?

相關鏈接:【JS】深入理解事件循環,這一篇就夠了!(必看)(https://zhuanlan.zhihu.com/p/87684858)

     JS事件循環(https://www.jianshu.com/p/184988903562)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM