ホームページ >よくある問題 >Golang スレッドとコルーチンの違いは何ですか?

Golang スレッドとコルーチンの違いは何ですか?

DDD
DDDオリジナル
2023-06-16 13:14:071162ブラウズ

Golang スレッドとコルーチンの違い: 1. 異なるスケジューリング方法。スレッドは CPU タイム スライスに従ってプリエンプティブにスケジュールされ、コルーチンは Go 言語ランタイム スケジューラーによってスケジュールされます。2. 異なるスケジューリング戦略。スレッドのプリエンプティブ スケジューリング、コルーチン協調スケジューリング; 3. コンテキストの切り替え速度が異なり、スレッドの切り替え速度は約 1 ~ 2 マイクロ秒、コルーチンの切り替え速度は約 0.2 マイクロ秒; 4. スタック サイズが異なり、スレッド スタックのサイズは通常は 8MB で、デフォルトの Go コルーチンのスタック サイズは 2KB です。

Golang スレッドとコルーチンの違いは何ですか?

この記事の動作環境: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。