Node單線程 - 怎麼理解"單線程"/Node實現多線程

Node單線程的理解

  • Node 是單線程的指的是 JavaScript 的執行是單線程的,但 Javascript 的宿主環境,不管是 Node 仍是瀏覽器都是多線程的
  • 在 Node 啓動後,會建立 v8 的實例,這個實例是多線程的(在活動監視器中看到的是多個線程)
  • 舉例node的線程node

    • 主線程:編譯、執行代碼。
    • 編譯/優化線程:在主線程執行的時候,能夠優化代碼。
    • 分析器線程:記錄分析代碼運行時間,爲 Crankshaft 優化代碼執行提供依據。
    • 垃圾回收的幾個線程
  • 問題瀏覽器

    • 對 cpu 利用不足
    • 某個未捕獲的異常可能會致使整個程序的退出等
  • 解決:使node具備多線程的實力多線程

    • 假:多進程的方式來模擬多線程 cluster(多進程模型)併發

      • cluster 實現了對 child_process 的封裝,經過 fork 方法建立子進程的方式實現了多進程模
      • 優秀表明:pm2
    • 真:實驗性質的模塊 worker_threads (Node 10.5.0 的發佈,官方纔給出了一個 給 Node 提供真正的多線程能力)

進程process和線程thread的區別

  • 進程:是資源(CPU、內存等)分配的基本單位它是程序執行時的一個實例。程序運行時系統就會建立一個進程,併爲它分配資源,而後把該進程放入進程就緒隊列,進程調度器選中它的時候就會爲它分配CPU時間,程序開始真正運行
  • 線程:程序執行時的最小單位它是進程的一個執行流,是CPU調度和分派的基本單位一個進程能夠由不少個線程組成,線程間共享進程的全部資源,線程由CPU獨立調度執行,在多CPU環境下就容許多個線程同時運行。一樣多線程也能夠實現併發操做,每一個請求分配一個線程來處理
  • 區別/優劣優化

    • 進程是資源分配的最小單位,線程是程序執行的最小單位
    • 進程有本身的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間,創建數據表來維護代碼段、堆棧段和數據段,這種操做很是昂貴。而線程是共享進程中的數據的,使用相同的地址空間,所以CPU切換一個線程的花費遠比進程要小不少,同時建立一個線程的開銷也比進程要小不少。
    • 線程之間的通訊更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通訊須要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點
    • 可是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另一個進程形成影響,由於進程有本身獨立的地址空間。

補充理解

計算機的核心是CPU,它承擔了全部的計算任務。它就像一座工廠,時刻在運行操作系統

  • 進程:CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態(一個車間開工的時候,其餘車間都必須停工。背後的含義就是,單個CPU一次只能運行一個任務)
  • 線程:(一個車間裏,能夠有不少工人。他們協同完成一個任務)線程

    • 一個進程能夠包括多個線程
    • 一個進程的內存空間是共享的,每一個線程均可以使用這些共享內存。(每間房間的大小不一樣,有些房間最多隻能容納一我的,好比廁所。裏面有人的時候,其餘人就不能進去了)
    • 一個線程使用某些共享內存時,其餘線程必須等它結束,才能使用這一塊內存設計

      • "互斥鎖":防止多個線程同時讀寫某一塊內存區域(一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去)
    • 某些內存區域,只能供給固定數目的線程使用。隊列

      • "信號量")(Semaphore),用來保證多個線程不會互相沖突(還有些房間,能夠同時容納n我的,好比廚房。也就是說,若是人數大於n,多出來的人只能在外面等着,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等着了)
  • 操做系統設計

    (1)以多進程形式,容許多個任務同時運行;進程

    (2)以多線程形式,容許單個任務分紅不一樣的部分運行;

    (3)提供協調機制,一方面防止進程之間和線程之間產生衝突,另外一方面容許進程之間和線程之間共享資源

相關文章
相關標籤/搜索