站長資訊網
        最全最豐富的資訊網站

        JavaScript的單線程你真的理解了嗎

        本篇文章給大家帶來了我們的JavaScript單線程的相關知識,JavaScript是一門單線程的語言,為什么JavaScript可以一邊執行定時器一邊執行函數,希望對大家有幫助。

        JavaScript的單線程你真的理解了嗎

        1. 進程與線程

        1.1 進程(Process)

        是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。程序是指令、數據及其組織形式的描述,進程是程序的實體。

        我們這里將進程比喻為工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態。

        1.2 線程(thread)

        是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。

        這里把線程比喻一個車間的工人,即一個車間可以允許由多個工人協同完成一個任務。

        2. 多線程的瀏覽器

        瀏覽器內核是多線程,在內核控制下各線程相互配合以保持同步,一個瀏覽器通常由以下常駐線程組成:

        • GUI 渲染線程

        • JavaScript引擎線程

        • 事件觸發線程

        • 定時觸發器線程

        • 異步http請求線程

        JavaScript的單線程你真的理解了嗎

        我們看到了JS引擎線程,非常的熟悉,沒有錯,這里是我們執行javascript腳本程序的地方。

        而JS引擎是多線程的,單線程是指JS引擎執行JS時只分了一個線程給他執行,意思是JS引擎分配了一個線程給JavaScript執行,也就是我們所說的單線程。

        2.1 這里再說下JS的執行機制

        由于JavaScript是單線程(一個Tab頁內中無論什么時候都只有一個JS線程在運行JavaScript程序)。

        所以我們需要依靠任務隊列來進行JavaScript代碼的執行。

        JS引擎會一直等待著任務隊列中任務的到來,然后執行任務。

        同步任務這么執行當然沒問題,我們把任務都放在任務隊列里,一個一個執行,邏輯很清晰。但是,如果我們向后臺發送請求,發送加接收這段時間可能需要一秒,我們不能等它一秒吧,如果請求五次,那就等五秒?顯示不符合我們的需求,所以,我們需要異步任務來處理這個問題。

        2.2 同步任務和異步任務

        同步任務是指在主線程上排隊執行的任務,只有前一個任務執行完畢,才能繼續執行下一個任務,當我們打開網站時,網站的渲染過程,比如元素的渲染,其實就是一個同步任務

        異步任務是指不進入主線程,而進入任務隊列的任務,只有任務隊列通知主線程,某個異步任務可以執行了,該任務才會進入主線程,當我們打開網站時,像圖片的加載,音樂的加載,其實就是一個異步任務。

        大家肯定對Event Loop有比較具象的認知,這邊我不詳細說了,不懂可以和我說,我再講就是了。

        3. 本文重重點–可直接看

        但是,大家有沒有對任務隊列抱有疑問?這是個對象?是個數組?按我的邏輯來說,我們JavaScript主線程執行同步函數,異步函數可以放在任務隊列里,這個任務隊列可以是個對象,當我們執行完同步任務的時候,把這個對象(任務隊列)壓進主線程中就可以了,但是事實并不我想的這樣的。

        Evnet Loop的任務隊列放在了瀏覽器的事件觸發線程中,當JS引擎執行異步函數的時候,會將異步任務放在事件觸發線程中,當對應的異步任務符合觸發條件被觸發時,事件觸發線程會把異步任務添加到JS引擎中的主線程的隊尾,等待執行。

        是不是和我們想象的JavaScript單線程不太一樣?好吧,確實不太一樣,所以最后的結論是,我們所說的任務隊列竟然是一個線程。

        然后,說回我們開頭剛開始說過的定時器,大家基本也能猜出來了,它是由定時器線程控制的。

        因為JavaScript是單線程的, 如果處于阻塞線程狀態就會影響記計時的準確,因此很有必要單獨開一個線程用來計時。

        當使用setTimeout或setInterval時,它需要定時器線程計時,計時完成后就會將特定的事件推入事件隊列中。

        4. 結論

        所以說,我們說JavaScript是單線程的沒錯,就是天王老子來了它也是單線程的,但是我們的Event Loop和定時器是放在其他線程中的。

        5. V8引擎–擴展

        V8引擎是一個JavaScript引擎實現,最初由一些語言方面專家設計,后被谷歌收購,隨后谷歌對其進行了開源。

        V8使用C++開發,在運行JavaScript之前,相比其它的JavaScript的引擎轉換成字節碼或解釋執行,V8將其編譯成原生機器碼(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如內聯緩存(inline caching)等方法來提高性能。

        有了這些功能,JavaScript程序在V8引擎下的運行速度媲美二進制程序。V8支持眾多操作系統,如windows、linux、android等,也支持其他硬件架構,如IA32,X64,ARM等,具有很好的可移植和跨平臺特性。

        5.1 工作流程

        V8引擎在執行JavaScript的過程中,主要有兩個階段:編譯和運行,與C++的執行前完全編譯不同的是,JavaScript需要在用戶使用時完成編譯和執行。在V8中,JavaScript相關代碼并非一下完成編譯的,而是在某些代碼需要執行時,才會進行編譯,這就提高了響應時間,減少了時間開銷。在V8引擎中,源代碼先被解析器轉變為抽象語法樹(AST),然后使用JIT編譯器的全代碼生成器從AST直接生成本地可執行代碼。這個過程不同于JAVA先生成字節碼或中間表示,減少了AST到字節碼的轉換時間,提高了代碼的執行速度。但由于缺少了轉換為字節碼這一中間過程,也就減少了優化代碼的機會。

        V8引擎編譯本地代碼時使用的主要類如下所示:

        • Script:表示JavaScript代碼,即包含源代碼,又包含編譯之后生成的本地代碼,即是編譯入口,又是運行入口;

        • Compiler:編譯器類,輔組Script類來編譯生成代碼,調用解釋器(Parser)來生成AST和全代碼生成器,將AST轉變為本地代碼;

        • AstNode:抽象語法樹節點類,是其他所有節點的基類,包含非常多的子類,后面會針對不同的子類生成不同的本地代碼;

        • AstVisitor:抽象語法樹的訪問者類,主要用來遍歷異構的抽象語法樹;

        • FullCodeGenerator:AstVisitor類的子類,通過遍歷AST來為JavaScript生成本地可執行代碼。

        JavaScript的單線程你真的理解了嗎

        JavaScript代碼編譯的過程大致為:Script類調用Compiler類的Compile函數為其生成本地代碼。Compile函數先使用Parser類生成AST,再使用FullCodeGenerator類來生成本地代碼。本地代碼與具體的硬件平臺密切相關,FullCodeGenerator使用多個后端來生成與平臺相匹配的本地匯編代碼。由于FullCodeGenerator通過遍歷AST來為每個節點生成相應的匯編代碼,缺失了全局視圖,節點之間的優化也就無從談起

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 欧洲精品99毛片免费高清观看| xxx国产精品视频| 97久久精品无码一区二区| 国产亚洲精品线观看动态图| 国产精品对白交换视频| 呦交小u女国产精品视频| 国产久爱免费精品视频| 视频二区国产精品职场同事| 国产精品乱码高清在线观看| 在线精品亚洲一区二区小说 | 久久精品国产99久久久香蕉| 国产在线拍揄自揄视精品不卡| 亚洲高清专区日韩精品| 精品久久久久久久久久中文字幕| 精品亚洲一区二区| 51午夜精品免费视频| 国产中老年妇女精品| 在线精品亚洲一区二区小说| 亚洲福利精品一区二区三区| 久久久久99精品成人片| 久久精品99无色码中文字幕| 国产精品自在拍一区二区不卡 | 国产精品久久99| 精品久久久久久无码专区不卡| 无码国内精品人妻少妇蜜桃视频 | 亚洲国产精品久久久久婷婷软件 | 日本精品一区二区久久久| 久久91这里精品国产2020| 国产精品VIDEOSSEX久久发布| 亚洲欧美日韩精品永久在线| 久久91综合国产91久久精品| 国产在线不卡午夜精品2021| 久久国产免费观看精品| 一区二区三区精品| 国产精品 视频一区 二区三区| 国产福利精品在线观看| 国产成人精品久久一区二区三区av | 国产精品成人99久久久久91gav| 久久久久久无码国产精品中文字幕| 国产成人久久精品麻豆一区| 国产精品午夜久久|