單線程無法充分利用多核CPU

Node在選型時決定在V8引擎之上構建,也就意味着它的模型與瀏覽器類似。我們的JavaScript將會運行在單個進程的單個線程上。它帶來的好處是:程序狀態是單一的,在沒有多線程的情況下沒有鎖、線程同步問題,操作系統在調度時也因爲較少上下文的切換,可以很好地提高CPU的使用率。

但是單進程單線程並非完美的結構,如今CPU基本均是多核的,真正的服務器(非VPS)往往還有多個CPU。一個Node進程只能利用一個核,這將拋出Node實際應用的第一個問題:如何充分利用多核CPU服務器?

另外,由於Node執行在單線程上,一旦單線程上拋出的異常沒有被捕獲,將會引起整個進程的崩潰。這給Node的實際應用拋出了第二個問題:如何保證進程的健壯性和穩定性?

面對單進程單線程對多核使用不足的問題,前人的經驗是啓動多進程即可。理想狀態下每個進程各自利用一個CPU,以此實現多核CPU的利用。所幸,Node提供了child_process模塊,並且也提供了child_process.fork()函數供我們實現進程的複製。

進程分爲兩種:主進程和工作進程。這是典型的分佈式架構中用於並行處理業務的模式,具備較好的可伸縮性和穩定性。主進程不負責具體的業務處理,而是負責調度或管理工作進程,它是趨向於穩定的。工作進程負責具體的業務處理,因爲業務的多種多樣,甚至一項業務由多人開發完成,所以工作進程的穩定性值得開發者關注。

對於CPU的一個核而言,某個時刻,只能執行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快,看上去就是在同一時刻運行。

其實,多線程程序並不能提高程序的運行速度,但能夠提高程序運行效率,讓CPU的使用率更高。

CPU的多核和應用程序的多線程的關係是怎麼樣的?

多核兒就是系統同時可以運行多個線程,比如雙核可以同時執行兩個線程。單核兒只能一次執行一個線程。

爲了利用多核 CPU 的計算能力,HTML5 提出 Web Worker 標準,允許 JavaScript 腳本創建多個線程,但是子線程完全受主線程控制,且不得操作 DOM。所以,這個新標準並沒有改變 JavaScript 單線程的本質。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章