ゴルーチンとコントラストのスレッド

別のスタック

  • スレッド:各OSスレッドはメモリの固定サイズのブロック(典型的には2メガバイト)をスタックない有し、スタックは現在の呼を格納するために使用されるか、または懸濁されている(他の関数によって呼び出されたとき、それが意味する)関数の内部変数の。固定サイズのスタック再帰関数は明らかに十分ではありません、より複雑なまたはより深いのために呼び出します。固定サイズを変更することはスペースの使用率を向上させることができ、あなたはより多くのスレッドを作成することができ、かつ深い再帰呼び出しを許可することができますが、二人はどちらも同じ時間ではありません。
  • ゴルーチン:ゴルーチンは、一般的にのみ2キロバイトに必要な、小さなスタックとそのライフサイクルを開始します。ゴルーチンスタック、および同じオペレーティング・システム・スレッド、それは関数のローカル変数を保存しますがしかし、アクティブまたは保留を呼び出し、ゴルーチンが固定されていないとして、OSのスレッドスタックサイズは同じではありません。スタックのサイズが必要になりますダイナミックストレッチ。通常の状況下で、最もゴルーチンは、このような大規模なスタックを必要としないものの、最大スタックゴルーチンは、従来の固定サイズのスレッドスタックよりも1ギガバイトは、はるかに大きいいます。

別のスケジューリング

  • スレッド:OSオペレーティング・システムのカーネルスレッドがスケジュールされています。数ミリ秒ごとに、ハードウェアタイマ割り込みハンドラは、それはスケジューラと呼ばれるカーネル関数を呼び出します。この関数は、現在実行中のスレッドを中断し、そのメモリレジスタの内容で保存され、スレッドが一度に実行してすることを決定することができるスレッドの一覧をチェックして、メモリからのスレッドのレジスタ情報を回復した後、実行サイトのスレッドを再開し、実行スレッドを開始します。オペレーティング・システム・カーネル・スレッドがスケジュールされているので、ユーザスレッドへの1つのスレッド、すなわち、格納されたメモリ状態から完全なコンテキストスイッチを必要とする別の「移動」は、別のスレッドがレジスタに復元され、スケジュールを更新するためデータ構造。それはいくつかのローカル貧弱なメモリアクセスを必要とし、実行中のCPUサイクルが増加しますので、これは、いくつかの手順が遅いです。
  • ゴルーチン:それはより多くの仕事(スケジューリング)、mはn番目ゴルーチンオペレーティングシステムのスレッドになるため、Nスケジューリング:ランタイムは、独自のスケジューラが含まれて行く、スケジューラは、Mのような技術の数を使用します。仕事に行くとカーネルスケジューラのスケジューリングは似ていますが、スケジューラは、単一の囲碁プログラムゴルーチンを持つ唯一の懸念です。そして、オペレーティングシステムをスケジュールするスレッドが行くスケジューラは、ハードウェアタイマを使用したが、囲碁言語「建物」、独自のスケジューリングではないが、異なっています。例えば、time.Sleepと呼ばれるまたはチャネルを呼び出すゴルーチンがブロックされたり、ミューテックス操作されると、スケジューラは休止状態にそれを入れて、時間が第1ゴルーチンを覚ます行くに右になるまで、他のゴルーチンを開始します。この方法は、カーネルのコンテキストにスケジュールするので、1つのスレッドのスケジューリングコストよりもゴルーチンを再スケジュール必要としないので、はるかに低いです。

GOMAXPROCS

スケジューラは、オペレーティングシステムのスレッドが同時に移動コードを実行されますどのように多くを決定するためにGOMAXPROCSという変数を使用しています移動します。デフォルト値は、機械の動作にCPUコアの数なので、機械コア8、スケジューラは、GOコード8 OSのスレッドをスケジュールすることができるとき。(:Nスケジューリングnの前にGOMAXPROCSがm述べ)。休眠ゴルーチンでは、通信中にブロックされたが、対応するスレッドが行うように予定されている必要はありません。I / Oやシステムコールまたは非通話機能では囲碁言語は、対応するオペレーティング・システムのスレッドの必要性があるときに、しかしGOMAXPROCSは考慮に入れ、これらの状況を必要としません。

あなたは、明示的にパラメータを制御するGOMAXPROCS環境変数を使用することができ、または実行時にruntime.GOMAXPROCS機能を変更するために使用することができます。以下では、このプログラムの小さなプログラムGOMAXPROCS効果は0無制限と1を出力します表示されます。

for {
    go fmt.Print(0)
    fmt.Print(1)
}
$ GOMAXPROCS=1 go run hacker-cliché.go
111111111111111111110000000000000000000011111...

$ GOMAXPROCS=2 go run hacker-cliché.go
010101010101010101011001100101011010010100110...

ときに最初に実行、唯一ゴルーチンの最大が実行されています。最初は本体のみゴルーチンが実行され、それは多くのことを印刷します。一定期間の後、それはスリープ状態になり、スケジューラを行くと、他のゴルーチン、0の多くの印刷を開始するには、この時間を覚ますと、印刷中に、ゴルーチンは、オペレーティングシステムのスレッドで予定されています。第二の性能は、我々は2つのゴルーチンが0と1の印刷を交互に同じ周波数で一緒に行うことができるように、2つのオペレーティングシステムのスレッドを使用する場合。あなたが実際には別のバージョンに当社の業績に応じて変動によるものであり、ここで結果を得るように、我々は、そのゴルーチンのスケジューリングは、多くの要因に影響され、ランタイムは常に進化を進化さを強調しなければなりません。

ゴルーチンID番号を持っていません

最も支持マルチスレッドオペレーティングシステムおよびプログラミング言語で、現在のスレッドは、一意の識別(ID)を有し、この識別情報を容易に、典型的には、共通の値の形で得られることが可能であることができます整数またはポインタ値。我々はスレッドローカルストレージの抽象化(番組内容、他のスレッドが訪問したくないマルチスレッド、スレッドローカルストレージ)非常に簡単になります。このケースでは、唯一の問題のマップキーとしてIDをスレッド化する必要が解決することができます各スレッドは、そのIDは値を導出することができるようになりますし、他のスレッドが競合していません。

ゴルーチンはのアイデンティティ(ID)の概念を取得するには、プログラマすることはできません。スレッドローカルストレージは常に悪用されますので、これは、これを行うための意図的なデザインです。例えば、WebサーバはTLSが達成サポートされている言語のいずれかを使用することであり、多くの情報が彼らに代わっ層の上に、それを格納することで、HTTP要求の機能は、(これは記憶層TLSでもよい)の検索になります見つけることは非常に一般的ですA。それは、この動作で、過度の依存のグローバル変数に、のような、非健康的な「外部からの行動」につながるプログラムのようなものだ、挙動はなく、することにより、独自の内部意思決定変数の関数ではないかもしれませんそれは、意思決定のスレッドで実行されます。そのため、糸自体の場合は身元が変更されます - など、いくつかのワーカースレッドなど - その関数の挙動が神秘的になります。

シンプルなパターンを奨励行く、関数パラメータのこのモードでは明示されています。これは、プログラムを読みやすく、そしていくつかの特定の機能を割り当てられたサブタスクの動作に影響を与えるために自分のアイデンティティ情報を気にすることなく、自由に私たちをできるようになるだけではなく。

あなたは今、すべての言語機能情報は、囲碁プログラムが必要とする記述を理解する必要があります。次の2つのセクションでは、我々はいくつかの以前の例とツールを見直し、我々はより大きなプログラムをサポートするために書く:このプロジェクトは、一連のパッケージに編成されるか、取得する方法を、構築、テスト、性能テスト、分析、ドキュメントを書きますこれらのパッケージは、それを共有しています。

おすすめ

転載: www.cnblogs.com/daryl-blog/p/11369601.html