Node.js現在、Node.js は、同時実行性の高いネットワーク アプリケーション サービスを構築するためのツールボックスのメンバーになりました。 ?この記事では、プロセス、スレッド、コルーチン、I/O モデルの基本概念から始めて、Node.js と同時実行モデルについて包括的に紹介します。
一般に、プログラムの実行インスタンスをプロセスと呼びます。これは、オペレーティング システムによるリソースの割り当てとスケジューリングの基本単位です。
process と呼ばれるプロセスを維持します。 table
テーブルでは、各プロセスはプロセス テーブル エントリ
(プロセス制御ブロック
とも呼ばれます) を占有します。これには、プログラム カウンター、スタック ポインター、メモリ割り当て、および開いているファイルのステータスが含まれます。スケジュール情報やその他の重要なプロセス ステータス情報を使用して、プロセスが一時停止された後にオペレーティング システムがプロセスを正しく復活できるようにします。プロセスには次の特徴があります:
プログラムが 2 回実行されると、オペレーティング システムでコードの共有が可能になったとしても (つまり、コードのコピーが 1 つだけメモリ内にある)、プログラムは変更できないことに注意してください。実行中のプログラム 2 つのインスタンスが 2 つの異なるプロセスであるという事実。
プロセスの実行中、中断や CPU スケジューリングなどのさまざまな理由により、プロセスは次の状態の間で切り替わります:
async/awaitは、次の例のようなコルーチンの実装です。
function updateUserName(id, name) { const user = getUserById(id); user.updateName(name); return true; } async function updateUserNameAsync(id, name) { const user = await getUserById(id); await user.updateName(name); return true; }
updateUserNameおよび
updateUserNameAsync内のシーケンスは次のとおりです:
を呼び出し、その戻り値を変数
user# に割り当てます。 ##;
updateName
メソッドを呼び出します;
は呼び出し元に
関数await## の場合を除き、上記の論理シーケンスに従って順番に実行されます。 # が発生した場合、
updateUserNameAsyncは一時停止され、一時停止された場所に現在のプログラムの状態が保存されます。後続のプログラム フラグメントが
awaitに戻るまで、再び起動されることはありません。
そして、一時停止前のプログラムの状態に戻して、次のプログラムの実行を続けます。
上記の分析を通じて、大胆に推測できます。コルーチンが解決する必要があるのは、プロセスやスレッドが解決する必要があるプログラムの同時実行性の問題ではなく、非同期タスク (ファイルなど) を処理するときに遭遇する問題です。
async/awaitに陥り、混乱が生じる可能性がありました。一般に保守が難しいコードは、コルーチンを使用して非同期コードを同期することで実現できます。 要牢記的是:協程的核心能力是能夠將某段程式掛起並維護程式掛起位置的狀態,並在未來某個時刻在掛起的位置恢復,並繼續執行掛起位置後的下一段程序。 一個完整的 我們可將 很多人經常將 阻塞/非阻塞 I/O I/O I/O Node.js 採用的是單執行緒、基於事件驅動的非同步 總之,本著簡單、高效的目的,Node.js 採用了單執行緒、基於事件驅動的非同步 要注意的是,Node.js 並不適合執行CPU 密集型(即需要大量計算)任務;這是因為EventLoop 與JavaScript 程式碼(非非同步事件任務程式碼)運行在同一線程(即主執行緒),它們中任何一個如果運行時間過長,都可能導致主執行緒阻塞,如果應用程式中包含大量需要長時間執行的任務,將會降低伺服器的吞吐量,甚至可能導致伺服器無法回應。 Node.js 是前端開發人員現在甚至未來不得不面對的技術,然而大多數前端開發人員對Node.js 的認知僅停留在表面,為了讓大家更能理解Node.js 的並發模型,本文先介紹了進程、線程、協程,接著介紹了不同的 最後,本文若有紕漏之處,也望大家能夠指正,祝大家快樂編碼每一天。 更多node相關知識,請造訪:nodejs 教學! 以上がNode.js のプロセス、スレッド、コルーチン、同時実行モデルについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。I/O 模型
I/O
操作需要經歷以下階段:
I/O
操作請求;I/O
操作請求進行處理(分為準備階段和實際執行階段),並將處理結果傳回使用者進(線)程。I/O
操作大致分為阻塞I/O
、非阻塞I/O
、同步I/O
、非同步I/O
四種類型,在討論這些類型之前,我們先熟悉下以下兩組概念(此處假設服務A 呼叫了服務B):
阻塞/非阻塞
:
阻塞呼叫
;非阻塞呼叫
。同步/非同步
:
同步
的;回呼
的方式將執行結果通知給A,那麼服務B 就是非同步
的。阻塞/非阻塞
與同步/非同步
搞混淆,故需要特別注意:
了解了
阻塞/非阻塞
針對於服務的呼叫者
而言;針對於服務的
被呼叫者而言。
與
同步/非同步,我們來看特定的
I/O 模型。
阻塞I/O
定義:用戶進(線)程發起
系統呼叫後,用戶進(線)程會立即被
阻塞,直到整個
I/O作業處理完畢並將結果回傳給使用者進(線)程後,使用者進(線)程才能解除
阻塞狀態,繼續執行後續操作。
由於此模型會阻塞使用者進(線)程,因此此模型不佔用CPU 資源;
操作的時候,用戶進(線)程不能進行其它操作;
請求就能阻塞進(線)程,所以為了能夠及時回應
I/O請求,需要為每個請求分配一個進(線)程,這樣會造成巨大的資源佔用,並且對於長連接請求來說,由於進(線)程資源長期無法釋放,如果後續有新的請求,將會產生嚴重的效能瓶頸。
非阻塞I/O
定義:
用戶進(線)程發起
特點:
系統呼叫後,如果該
I/O操作未準備就緒,則該
I/O呼叫將會傳回錯誤,使用者進(線)程也無需等待,而是透過輪詢的方式來偵測該
I/O操作是否就緒;
操作會阻塞使用者進(線)程直到執行結果返回給用戶進(線)程。
由於該模型需要使用者進(線)程不斷地詢問
操作就緒狀態(一般使用
while循環),因此此模型需佔用CPU,消耗CPU 資源;
操作就緒前,使用者進(線)程不會阻塞,等到
I/O操作就緒後,後續實際的
I/O操作將阻塞使用者進(線)程;
同(異)步I/O
用戶進(線)程發起
系統呼叫後,如果此
I/O呼叫會導致使用者進(線)程阻塞,那麼該
I/O呼叫便為
同步I/O,否則為
非同步I/O。
操作
同步或
非同步的標準是用戶進(線)程與
I/O操作的通訊機制,其中:
同步
情況下用戶進(線)程與I/O
的交互是透過內核緩衝區進行同步的,即內核會將I /O
操作的執行結果同步到緩衝區,然後再將緩衝區的資料複製到用戶進(線)程,這個過程會阻塞用戶進(線)程,直到I/O
操作完成;非同步
情況下用戶進(線)程與I/O
的互動是直接透過核心進行同步的,即核心會直接將I/O
操作的執行結果複製到使用者進(線)程,這個過程不會阻塞使用者進(線)程。Node.js 的並發模型
I/O
模型,個人認為之所以選擇該模型的原因在於:
I/O
密集的,在保證高並發的情況下,如何合理、有效率地管理多執行緒資源相對於單執行緒資源的管理更加複雜。I/O
模型,並透過主執行緒的EventLoop 和輔助的Worker 執行緒來實現其模型:
總結
I/O
模型,最後對Node.js的並發模型進行了簡單介紹。雖然介紹 Node.js 並發模型的篇幅不多,但筆者相信萬變不離其宗,掌握了相關基礎,再深入理解 Node.js 的設計與實現必將事半功倍。