うCPUのレジスタに、どのように使い、特にWRT multithreading?
-
24-09-2019 - |
質問
この問いは、私の答え以下を中心に対応地域内の混乱が他の質問です。
末に答えが課題WRT"不安定"のスレッドsynchronisationしているところは完全に確約したことを歓迎のコメント代替の応答となります。の質問に主に関連CPUに登録されているかチェックしています。
解決
CPUのレジスタを小領域のデータ保存のシリコンのCPUを搭載しています。のための大部分のアーキテクチャでは、彼らの根本的な隔たりがあるようであるすべての操作が起こる(データが読み込まれ記憶を、押し戻されます。
あのスレッドが実行用のレジスタとを有する指導のポインタ(ないようにする指示が付属。OS起動時にスワップに別のスレッドのCPU状態などのレジスタの指示のポインタを取得し保存オフのどこかに効果的に凍結乾燥状態のスレッドができています。
多くの文書を全てことはもちろん、すべての場所です。 Wikipediaに登録する Wikipediaのコンテキストスイッチング時の値です。※ まず.編集:読むSteve314の答えです。:)
他のヒント
レジスタの作の"保管にCPUを搭載しています。彼らは非常に高速で非常に限られた資源です。典型的な例としては、CPUの小さな固定セットの名前を登録し、名前の一部のアセンブラ言語条約るCpuの機械のコードです。例えば、32ビットIntel x86Cpuとしては、本データレジスタ名eax,ebx,ecx、edxをはじめとする、いくつか割り出し、その他の専門性登録する
厳密に言えば、こんなかなか真のこの登録名を変更したいと考えます。一部のプロセッサには十分なレジスタとその数により命名規ることができました。では、基本モデルを創出。例えば、登録名を変更したいが利用され、幻想の基本的なモデルでもあるため、実行します。
利用登録手書きアセンブラがあり単純なパターンの登録利用します。数の変数に保管され、純粋にレジスタ間の互に、または一部の充実がこれに取り組んでくれました。その他のレジスタに使用されてい読み取りの変更-書きパターンです。たとえば---
mov eax, [var1]
add eax, [var2]
mov [var1], eax
IIRCは有効なものでしょう非効率的)x86アセンブラコードです。は、モトローラ68000いが込---
move.l [var1], d0
add.l [var2], d0
move.l d0, [var1]
この時、ソースは通常左のパラメータの先る。の68000 8つのデータレジスタ(d0..d7)、8アドレスレジスタ(a0..a7)、a7IIRCとしての役割も果たしているスタックポインタです。
に6510(裏の古き良きコミ64いが込---
lda var1
adc var2
sta var1
の登録をここは暗黙的に指示-上記のすべての利用(アキュムレータ)です。
ご容赦下さいせんに誤りがこれらの事例-I havenにな大量の"リアル"より仮想的な)アセンブラで少なくとも15年間です。その原理のポイントです。
ご利用のレジスタに特有の特定のコードフラグメント.何を持は基本的にどのような最後に実行された命令を残します。この責任のプログラマのイラストに何かがそれぞれの登録についたものです。
呼び出し時に互いずれかを呼び出し側は相手先の責任の確保が、紛争"という意味で、一般的には、レジスタに保存され、スタックの開始時に呼び出しに戻ります。同様の問題が起こる割り込みを行う.のような責任を担う存するレジスタ(呼び出し側は相手先は、通常、一部の書類の型です。
コンパイラは通常の使い道を決めるレジスタがつながりのなかにさりげなく洗練された外人プログラマーが作動するのと同じ原理です。のマッピングからレジスタの特定の変数は動的であり、大きく変化する断片をコードを探しています。保存/復元を登録は取り扱いによる標準コンベンションがコンパイラが即興で"カスタム呼び出し規約"の一部下さい。
通常、局所変数の機能は想像での生活をスタックです。この原則は"auto"自動に変C.以来、"自動車"のデフォルトは、通常のローカル変数.たとえば---
void myfunc ()
{
int i; // normal (auto) local variable
//...
nested_call ();
//...
}
上記のコードに、"私"が開催され、主に、登録できます。している可能性もありますか登録する他の機能が進行していきます。しかし、"nested_call"と呼ばれ、この値から登録までほぼ確実にスタック-のいずれかの変数はスタック変数ではないの登録、または、登録内容は保存されるnested_call独自の働きます。
にmultithreadingアプリでは、通常のローカルな変数は地域の特定のスレです。各スレッドが自身のスタックでは、専用のCPUのレジスタ.コンテキストのスイッチ、レジスタが保存されます。から登録またはスタック、ローカルな変数は共有スレッド)。
この基本的な状況が保存されてマルチコアの応用も二つ以上のスレッドが活躍することでも同時に行います。各コアは、独自のスタックは、独自に登録する
蓄積されたデータの共有メモリを要するものです。このグローバル変数,静的変数内のクラスも、機能、ヒープ割り当てオブジェクト。たとえば---
void myfunc ()
{
static int i; // static variable
//...
nested_call ();
//...
}
この場合、この値は"i"で保存と機能します。静的地域主記憶は一切の店この値は、この"静").原則として必要ありませんの特別な行動に保存"か"に対して通話中の"nested_call"は、一見の変数にアクセスできるのから任意のスレッドの走り任意のコア(あるいは、別のCPU).
しかし、コンパイラは必ずしも一致するものではないハード最適化の速さやサイズのコードです。繰り返し読み込みおよび書き込むメインメモリよりもずっと遅いですが登録です。コンパイラのほぼ確実に選ぶ ない の簡単な読み取りの変更-書きパターンは、上記は代わりに常に価値の登録のための比較的長期間繰り返しを避ける読み書きを同じます。
このページを正しく一つのスレッドがないことが別のスレッドによります。二つのスレッドがとても様々なアイデアを、"i"です。
ありませんの魔法のハードウェア解決します。例えば、機構が存在しないためsynchronisingの登録とスレッド)。のCPUでは、変数の登録が完全に独立した主体となることを知る必要もあり同期.が確実になsynchronisationレジスタ間の異なるスレッドや走行に異なるコアの数-理由はありませんという別のスレッドが同じ登録することを目的意しています。
部分的に解決するフラグを変数として"不安定な"...
void myfunc ()
{
volatile static int i;
//...
nested_call ();
//...
}
これはコンパイラのない最適化を読み込みおよび書き込みは可変となります。プロセッサーのないコンセプトのボラティリティこのキーワードはコンパイラ生成の異なるコードは、即時に読み込みおよび書き込みのメモリとして指定する課題ではなく、回避方にアクセスを利用するものとする。
この ない a multithreading synchronisation液が少ないものではない。一つ適切なmultithreading使のロック管理へのアクセスはこの"共有資源".たとえば---
void myfunc ()
{
static int i;
//...
acquire_lock_on_i ();
// do stuff with i
release_lock_on_i ();
//...
}
ありちはすぐに自明である。原則としてではなく書きの"i"はその変数に"release_lock_on_i"コールで保存されるのでスタックです。どのコンパイラではな理由のないで行なっているのがスタックアクセスがとにかく(省に戻りアドレスでの登録スタックがより効率的に文書で"i"よりキャッシュタイアップにアクセスする完全に独立したブロックのメモリを消費します。
残念ながら、ものの、リーズロック機能しないことを知らない変数を書いていない背中にメモリ未でき、そこに何もしないで修理してください。し、その機能のはただの図書館に電話をロック-リリースに隠され、より深く入れ子にされた)ことになる図書のためには、年前のお申し込みでお知らない どのよう その呼び出し側用レジスタまたはスタックです。それは大きな部分をなぜ使用しているスタック、呼び出し規約を標準化された(例えば人に保存するレジスタ).のロック機能な力の呼び出し側"synchronise"登録する
同様に、relink古いアプリを新しい図書館の呼び出し側が知らないう"release_lock_on_i"はどうやって、そこに機能する。で知らないが必要であると考える保存登録しなければならないを記憶します。
を解決することができるので持ち帰り、"不安定".
void myfunc ()
{
volatile static int i;
//...
acquire_lock_on_i ();
// do stuff with i
release_lock_on_i ();
//...
}
を使用する場合もあります通常のローカル変数の一時的なロックが活力を与えるコンパイラの使用に登録する短い期間です。原則としても、ロックを釈放するべきである。早くべきではないのでそのコードにあります。いものを書いています当社の一時変数の裏に"i"の前に、ロック解除のボラティリティの"i"よりメインメモリ。
原則として、これが充分でないのです。書きメインメモリなんて書いてメインメモリが重層キャッシュのトラバースの合間に、お客様のデータが座って任意の層。がある"モバリア"の問題であり、かつことが幸いなことにこの問題の責任のスレッドsynchronisation電話などのロックの獲得-放電話ます。
このメモリのバリア問題ないが不要になるの揮発性"キーワードにしています。