Go コルーチンがプロセスやスレッドよりも占有するシステム リソースが少ないのはなぜですか?

導入

プロセスとは、プログラムの実行時に占有される独立した仮想メモリ空​​間であり、Linux では、スタック、未使用メモリ、ヒープ、BSS、DATA、TEXT などの仮想メモリ空​​間がプロセスごとに割り当てられます。

スレッドは軽量プロセスとみなすことができます。1 つのプロセス内で複数のスレッドが「共生」します。各スレッドは独立したスタック空間を持ち、他の仮想メモリ空​​間を共有します。そのため、スレッド間の通信は比較的単純で、共有メモリを介して通信します。

プロセスとスレッドはいずれも CPU の実行単位であり、カーネル状態で切り替えられるため、切り替えコストが高くなります。

コルーチンはユーザーモードの仮想的な実行単位であり、ユーザーモードで実行プロセスを切り替える場合、切り替えコストが低くなります。


実行ユニットの切り替えコスト

スレッドとコルーチンの間の切り替えプロセスを紹介することで、カーネル モードでの切り替えのコストが高く、ユーザー モードでの切り替えのコストが低い理由を説明します。

プロセスとスレッドの両方がカーネル状態で切り替わり、プロセス スイッチングのコストはスレッド スイッチングのコストよりも高いため、スレッド スイッチングとコルーチン スイッチングのスイッチング コストのみが導入されます。

カーネルモードスイッチ - スレッド

カーネル モードでのスレッドの切り替えを理解する前に、まず CPU タイム スライスとは何かを理解しましょう。オペレーティング システムでは、多くのソフトウェアがインストールされ、同時に複数のソフトウェアが使用され、CPU リソースは限られています。

オペレーティングシステム上で複数のソフトウェアを同時に実行できるようにするために、CPU はタイムスライスに分割され、各タイムスライスで 1 つのソフトウェアの 1 つのスレッドが実行されます。タイムスライスは非常に短いため、複数のソフトウェアが動作しているように感じられます。同時に実行中です。

コードを作成するとき、プログラムにより多くの CPU リソースを割り当てることができるようにするために、より多くのスレッドを作成してプログラムの効率を向上させることができます。作成するスレッドの数が多ければ多いほど良いことに注意してください。

CPUがカーネル状態で実行ユニット(スレッド)を切り替える際に時間コストがかかるため、実行ユニットを切り替える際にはレジスタにデータを保存し、元の実行ユニットの状態を保存する必要があります。 CPU リソース (タイム スライス) も占有するため、スレッドの実行に使用できる CPU リソース (タイム スライス) が減少します。

時間コストに加えて、パフォーマンスのオーバーヘッドも発生します。システム カーネルはスレッドをスケジュールしますが、最も高い権限を持つカーネル空間だけがスレッドをスケジュールできるため、ユーザー空間とカーネル空間の間で切り替える必要があります。スペースの制限により、これ以上詳しくは説明しません。

ユーザーモードの切り替え - コルーチン

スレッド (実行ユニット) を作成すると、プログラムにより多くの CPU リソースを確保しようとしますが、スレッドの切り替え時に CPU リソース (時間コスト) も浪費されるため、実行ユニットはカーネル モードで実行できなくなり、代わりにカーネル モードで実行されます。ユーザーモード、つまりコルーチンです。

コルーチンの切り替えコストは、切り替えが比較的単純でユーザー モードで行われるため、低コストです。切り替えの時間コストは低い (ナノ秒レベル)。最初に現在のコルーチンの CPU レジスタの状態を保存するだけで済みます。 then CPU リソースを必要とするコルーチンの CPU レジスタの状態を CPU レジスタにロードします。

Go コルーチンのスケジューリングについては、以前の記事で紹介したので、ここでは繰り返しません。


メモリ使用量

CPU リソースが限られていることに加えて、メモリ リソースも限られているため、プロセス、スレッド、コルーチンのメモリ使用量も理解する必要があります。

32 ビット オペレーティング システムでは、プロセスが 4G メモリのメモリ スティックのみをサポートしていることを読者は知っておく必要があります。これは、32 ビット オペレーティング システムではプロセスが最大 4G のメモリしか占有できないのに対し、64 ビット オペレーティング システムではさらに多くのメモリを占有することができるためです。

スレッドが占有するメモリは通常 10MB ですが、オペレーティング システムのバージョンによっては 4M から 64M の範囲で若干の違いがあります。

コルーチンが占有するメモリは最も小さく、1 つのコルーチンは約 2KB のメモリを占有します。


 4 

要約する

この記事では、Go コルーチンがプロセスやスレッドに比べてシステム リソースの占有量が少ない理由を主に紹介しますが、プロセス、スレッド、コルーチンの CPU リソースとメモリ占有量を比較することで、実行中に消費される CPU リソース (タイム スライス) が原因であることがわかります。メモリ使用量の点では、Go コルーチンには明らかな利点があります。

一言で言えば、Go コルーチンのスイッチング コストとメモリ使用量は、スレッドやプロセスよりも低くなります。

Go コルーチンが占有するシステム リソースは少ないですが、それは Go コルーチンを無限に作成できるという意味ではないことに注意してください。

参考文献:

  1. https://www.geeksforgeeks.org/time-slicing-in-cpu-scheduling/

  2. 仮想メモリ

おすすめ

転載: blog.csdn.net/qq_54129105/article/details/132263418