ホームページ > バックエンド開発 > Golang > Go言語のスレッドとプロセスの違いは何ですか

Go言語のスレッドとプロセスの違いは何ですか

青灯夜游
リリース: 2022-12-28 12:56:05
オリジナル
4428 人が閲覧しました

違い: 1. スレッドはプログラム実行の最小単位であるのに対し、プロセスはオペレーティング システムによって割り当てられるリソースの最小単位です。 2. プロセスは 1 つ以上のスレッドで構成されます。スレッドは、プロセス内のコードのさまざまな実行ルートです。 3. スレッド コンテキストの切り替えは、プロセス コンテキストの切り替えよりもはるかに高速です。 4. プロセスの切り替えは最大のリソースを必要とし、非常に非効率的です。スレッドの切り替えは平均的なリソースを必要とし、効率は平均的です。 5. プロセスには独自のスタックがあり、そのスタックはプロセス間で共有されません。スレッドは独自のスタックを持ち、ヒープを共有します。

Go言語のスレッドとプロセスの違いは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

スレッドとプロセスとは何ですか?

プロセス

  • は、 データ セット 上に特定の 独立関数 を備えたプログラムです。 動的実行プロセス
  • # は、オペレーティング システムによるリソースの割り当てとスケジューリングのための独立したユニットです
  • # これは、アプリケーションの動作のキャリアです

スレッド

    スレッドはプログラム実行における単一の逐次制御プロセスです
  • プログラム実行の最小単位ですフロー
  • プロセッサのスケジューリングと割り当ての基本単位です
  • プロセスには1つ以上のスレッドを含めることができます
  • プログラムのメモリ空間は各スレッド間で共有されます

タスク スケジューリング

ほとんどのオペレーティング システム (Windows、Linux) のタスク スケジューリングでは、

タイム スライス ローテーション プリエンプティブ スケジューリング方法#が採用されています。 ##。 スケジュール方法は次のとおりです。

    プロセス内で、スレッド タスクが数ミリ秒間実行されると、オペレーティング システム カーネルによってスケジュールされます
  • ハードウェア カウンターを通じてプロセッサに割り込み、スレッドを強制的に一時停止して、スレッドのレジスタをメモリに置きます
  • 次にどのスレッドを実行するかを調べて決定します。スレッド リスト
  • 次に、メモリからスレッドのレジスタを復元し、最後にスレッドの実行を再開して次のタスクを実行します
  • この方法では、各スレッドが順番に実行されることが保証されており、CPUの実行効率が非常に高く、タイムスライスが非常に短いため、タスクの切り替えが早く、あたかも複数のタスクが同時に実行されているような印象を与えます。これが
同時実行性

について説明する内容です。

Go言語のスレッドとプロセスの違いは何ですか#プロセスとスレッドの違い

スレッドは最小の部分ですプログラム実行単位のことであり、プロセスはオペレーティング システムがリソースを割り当てる最小単位です。

  • プロセスは 1 つ以上のスレッドで構成され、スレッドはプロセス内のコードのさまざまな実行ルートです。

  • スレッド コンテキストの切り替えはプロセス コンテキストの切り替えよりもはるかに高速です

  • プロセスの切り替えは最大のリソースを必要とし、非常に非効率的です。スレッドの切り替えには平均的なリソースが必要です。平均的な効率を持っています。

  • プロセスには独自のスタックがあり、スタックはプロセス間で共有されず、オペレーティング システムによってスケジュールされます。

    スレッドには独自のスタックがあり、ヒープを共有します。また、オペレーティング システムによってもスケジュールされます
  • マルチスレッドとマルチコア

マルチコア プロセッサ は、1 つのプロセッサへの統合を指します。 コンピューティング能力を向上させるために、複数の コンピューティング コア

がインストールされます。つまり、真の並列コンピューティングには複数の処理コアがあり、各処理コアはカーネル スレッドに対応します。

#カーネル スレッド

各処理コアはカーネル スレッドに対応します。 例:

シングルコア プロセッサは 1 つのコア スレッドに対応しますデュアルコア プロセッサは 2 つのコア スレッドに対応します

クアッドコア プロセッサは 4 つのカーネル スレッドに対応します。
  • カーネル スレッド (KLT) は、オペレーティング システム カーネルによって直接サポートされるスレッドです。スレッドはカーネルによって切り替えられ、カーネルはスケジューラを操作してスレッドをスケジュールし、スレッドのタスクを各プロセッサにマッピングする役割を果たします。
ハイパー スレッディング テクノロジー

現在、プロセッサーは ハイパー スレッディング テクノロジーを使用して、物理処理を組み合わせています。 core 2 つの

論理処理コア

、つまり 2 つのカーネル スレッドにシミュレートされます。 したがって、私たちが目にするコンピューターは通常、デュアルコアと 4 スレッド、または 4 コアと 8 スレッドです。 オペレーティング システムでは、CPU の数が実際の物理 CPU の数の 2 倍であることがわかります。たとえば、デュアルコアと 4 スレッドでは 4CPU が認識されます。 たとえば、現在記事を書いている mbp は i7 6 コア 12 スレッドです。

プログラムは通常、カーネル スレッドを使用しません。直接実行しますが、カーネルを使用します。スレッドの高レベル インターフェイスであるライトウェイト プロセス (LWP)。これは、しばしば

スレッド

と呼ばれるものです。

Go言語のスレッドとプロセスの違いは何ですか

コルーチン

コルーチンはスレッドに基づいており、スレッドよりも軽量です。スレッドには複数のコルーチンを含めることができます。

コルーチンの目的

従来のアプリケーションでは、通常、ビジネス ロジックを完成させるために、ネットワーク リクエストに対してスレッドが作成されます。複数のリクエストがある場合、複数のスレッドが作成されます。
時間のかかる I/O 動作が発生した場合、スレッドは常にブロック状態になります。多くのスレッドがこのアイドル状態 (スレッドの実行が完了するのを待ってから実行する) になると、リソースの適用が発生します。徹底しないとシステムのスループット能力が低下します。

最も一般的な時間のかかる I/O 動作は、JDBC などです。CPU は常にデータ I/O 操作の戻りを待ちます。このとき、スレッドは CPU を使用して実行しません。まったく動作しませんが、アイドル状態です。同時に使用するスレッドが多すぎると、コンテキスト切り替えのオーバーヘッドも増加します。

上記の問題には 2 つの解決策があります:

  • 単一スレッドと非同期コールバック
    たとえば、Node.js、Java の Vert.x
  • Coroutine
    コルーチンの目的は、長期にわたる I/O 操作が発生したときに現在のコルーチン スケジュールを放棄し、次のタスクを実行して、ContexSwith

## のオーバーヘッドを排除することです。 #コルーチンの特徴

    スレッドの切り替えはオペレーティング システムによってスケジュールされ、コルーチンはユーザー自身によってスケジュールされるため、コンテキストの切り替えが減り、効率が向上します
  • スレッドのデフォルトのスタック サイズは 1M ですが、コルーチンはより軽量で 1K に近くなります。したがって、同じメモリ内でより多くのコルーチンを開くことができます
  • コルーチンは同じスレッド上にあるため、競合を回避できます。シーン。ただし、大量の計算をマルチスレッド化するのには適していません。

#コルーチンの原理# #コルーチンの処理 :

I/O ブロッキングが発生した場合、コルーチンのスケジューラーはデータ ストリームを生成することにより、それをスケジュールします。すぐに (積極的にあきらめて)、現在のスタックにデータを記録します。

  • ブロッキングが完了したら、すぐにスレッドを通じてスタックを復元し、ブロッキング結果をこのスレッドに書き込みます。 run

  • Coroutine
  • で実行されているスレッドは
  • Fiber

    と呼ばれます。たとえば、Golang の

    go
  • キーワードは次のとおりです。実際には
Fiber

を開く役割を果たし、その上で func ロジックを実行させます。 コルーチンの一時停止はプログラムによって完全に制御され、ユーザー状態で発生するため、スレッドのブロック状態はオペレーティング システム カーネルによって切り替えられ、カーネル状態で発生します。 したがって、コルーチンのオーバーヘッドはスレッドのオーバーヘッドよりもはるかに小さく、コンテキスト切り替えのオーバーヘッドはありません。 #スレッドとコルーチンの比較


##比較項目

スレッドCoroutine

スケジューリングは 切り替えオーバーヘッド##パフォーマンスの問題リソースの占有率が高すぎるため、頻繁に作成と破棄を行うと重大なパフォーマンスの問題が発生しますリソースの占有率が小さいです深刻なパフォーマンスの問題が発生することはありません。データ同期データの一貫性と可視性を確保するためにロックなどのメカニズムが必要です必要ありませんマルチスレッド ロック メカニズムなので、スレッドは 1 つだけです。変数の同時書き込みで競合が発生しない 共有リソースはロックせずにコルーチン内で制御される 状態を把握するだけで済むため、スレッドよりも実行効率が大幅に高い【関連する推奨事項: Go ビデオ チュートリアル プログラミング教育
占有リソース 初期単位は 1MB、固定および不変です 初期単位は通常 2KB必要に応じて増やすことができます
に属します OS カーネルによって完了します ユーザーによって完了します
デザイン モード切り替え (ユーザー モードからカーネル モードへの切り替え)、16 個のレジスタ、PC、SP、およびその他のレジスタのリフレッシュ 3 つのレジスタ値のみが変更されます: PC 、SP、DX
]

以上がGo言語のスレッドとプロセスの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート