Golang スレッドとコルーチンの違い: 1. 異なるスケジューリング方法。スレッドは CPU タイム スライスに従ってプリエンプティブにスケジュールされ、コルーチンは Go 言語ランタイム スケジューラーによってスケジュールされます。2. 異なるスケジューリング戦略。スレッドのプリエンプティブ スケジューリング、コルーチン協調スケジューリング; 3. コンテキストの切り替え速度が異なり、スレッドの切り替え速度は約 1 ~ 2 マイクロ秒、コルーチンの切り替え速度は約 0.2 マイクロ秒; 4. スタック サイズが異なり、スレッド スタックのサイズは通常は 8MB で、デフォルトの Go コルーチンのスタック サイズは 2KB です。
この記事の動作環境: Windows 10 システム、go1.20 バージョン、dell g3 コンピューター。
Golang スレッドとコルーチンの違い:
1. スケジューリング方法
スレッド: スレッドは CPU タイム スライスに基づいてプリエンプティブにスケジュールされます。オペレーティング システムは、割り込み信号 (タイマー割り込み、I/O デバイス割り込みなど) を通じてスレッド コンテキストの切り替えを実行します。スレッド コンテキストの切り替えが発生すると、オペレーティング システムのユーザー モードからカーネル モードに移行し、ステータス情報が保存される必要があります。実行する次のスレッドに切り替えるときは、ステータス情報をロードして、スレッドから転送する必要があります。カーネルモードからオペレーティングシステムのユーザーモードへ。
コルーチン: コルーチンはユーザー モードで存在し、go 言語ランタイム スケジューラーによってスケジュールされます。コルーチンは特定のスレッドに属します。複数のコルーチンを 1 つのスレッドにスケジュールできます。1 つのコルーチンを複数のスレッドに切り替えて実行することもできます。したがって、コルーチンとスレッドは多対多 (M:N) の関係になります。
2. スケジューリング戦略
スレッド: プリエンプティブ スケジューリング。各スレッドの実行サイクルのバランスをとるために、オペレーティング システムのスケジューラは定期的に割り込み信号を送信して、スレッド コンテキストの切り替えを強制します。
コルーチン: 共同スケジューリング。コルーチンは、自身のタスクの処理を完了した後、他のコルーチンに実行権限を積極的に譲渡することができ、簡単にプリエンプトされることはありません。コルーチンが長時間実行された場合にのみ、Go 言語スケジューラーはその実行を強制的にプリエンプトします。
3. コンテキスト切り替え速度
スレッド: スレッド コンテキストの切り替えには、オペレーティング システムのユーザー モードとカーネル モードの間の切り替えが必要です。切り替え速度は約 1 ~ 2 マイクロ秒です。 . .
コルーチン: コルーチンはユーザー モードの軽量スレッドです。コルーチンの切り替えにはユーザー モードとカーネル モード間の切り替えは必要なく、切り替え時に保存する必要があるのはいくつかのステータス値だけです。速度は数倍速く、約0.2マイクロ秒です。 (スレッド切り替え速度の約10倍)
4. スタックサイズ
スレッド: スレッドのスタックサイズは、Linux、Macでは通常作成時に指定されます。デフォルトのスタック サイズは通常 8MB です (ulimit -s で表示できます)。 2000 スレッドには 16G の仮想メモリが必要です。
コルーチン: デフォルトの go コルーチン スタック サイズは 2KB で、16G の仮想メモリで 800 万個を超えるコルーチンを作成できます。実際には、何千ものコルーチンが存在するのが一般的です。
以上がGolang スレッドとコルーチンの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。