質問

かについて少し組み立て、となることができること4、8、又はその汎用レジスタ.どのような全てのプログラムをコンピューター作業だける金額の登録、特にmultithreadingとできません。

役に立ちましたか?

解決

マルチスレッド自体は、使用中のレジスタの数に影響しません。スレッドが交換されると、通常、レジスタがメモリに保存され、実行する次のスレッドには以前の保存からそれらのレジスタがロードされます。

例は、スレッド制御ブロック構造(TCB)を持つシステムです。この構造には(スレッドが実行されていない間)、保存された命令ポインター、スタックポインター、汎用レジスタ、フローティングポイントレジスタ、スレッド統計などが含まれます。要するに、すべては、別のスレッドが実行されるように交換されたときに、スレッドを完全に状態に復元する必要がありました。

そして、コンピューターで起こっていることすべてがレジスタで行われるわけではありません。最新のコンパイラはコードを最適化できるため、使用されるデータ項目がレジスタに保持されますが、データの大部分はメモリに保持され、必要に応じてレジスタにのみ購入されます。

私がこれまでにこの主題について読んだ最高の本は タネンバウム 「構造化されたコンピューター組織」 これは、デジタルロジックレベルからオペレーティングシステムレベルまで、レイヤーの観点からコンピューターを調べ、各レベルが前のレベルを構築します。

           alt text

さておき: 私の夢はいつかこのように本をカバーする本を書くことです すべての, 、クォークレベルからemacsまで:-)

他のヒント

他の変数とスレッドスタックは通常、保護されたメモリスペースに保存され、必要に応じてレジスタに呼び出すことができます。

あなたは本をチェックしたいかもしれません コンピューティングシステムの要素 コンピューターのCPUがどのように機能するかをよく理解してください。この本は、NANDゲートからCPU、アセンブラー、シンプルなコンパイラ、および小さなオペレーティングシステムに取り組む一連のプロジェクトとして設定されています。すべてのコンピューターの部品がどのように適合するかを理解するのは非常に貴重です。

各スレッド(プロセス)スワップ取引はすべてのレジスタを押し出された、スタックによる営業システムカーネルへのデータ構造は通常のプロセス制御ブロックです。そして、スレッド処理のスワップには、登録のデータからの読み込み基板とポップのスタックに登録する


が内部レジスタマッピングテーブルのx86は内部的にこのような仮想化テーブルに登録の保存のIA32命令セット-アーキテクチャを有しながら柔軟性を設計が開始されたスーパスカラアーキテクチャ洗練された指導ケジューリングアルゴリズム

また、命令セットのい 負荷店舗 指導は、と連動して使用することによりポインタをメモリーデータを格納できるようにするからレジスタに記憶です。であるが、長期荷重-Store機械から、コンピュータのない指示を直接実行さい。

一部のコンピュータな指示で動作する記憶一部のスタックベースです。によってデザイナーの制約に配置されます。

あなたは、単純なものでさえも数千から数百万の議会の指示が実行されることを認識する必要があります。これらのレジスタは、頻繁に値を交換しています。

実際には、コンピューターがどのように多くのレジスタを使用して、すべてを達成することができるかは非常に興味深いです。

これは、非常に効率的に使用できるレジスタが非常に少ないことを可能にするアセンブリレベル(通常は恐ろしい巧妙なコンパイラによる)で本当に賢いプログラミングです。

問題が提供された数少ないレジスタのみを完了することが不可能な場合、プログラムは通常、そのレジスタをメインメモリスタックに「流出」します。スタックのどこにあるかを思い出すことで、こぼれたレジスタを置くことができます。簡単に取り戻すことができます。

レジスタを使い果たしたとき、私たちはそれらをスタックに保存するだけで、それは私たちに与えます 遠い 私たちのほとんどが私たちのプログラムに必要なよりも多くのスペース。

マルチスレッドの特定のケースでは、すべてのレジスタをメモリに保存するだけで、他のスレッド用のクリーンなスレートがあります。

これは、コンピューターの他のストレージ、特にRAMが使用されるものの1つです。レジスタの内外データを保存および復元するために使用されます。

別のスレッドが実行できるように、スレッドが切り替えられたとき。最初のスレッドレジスタ状態はどこか(スタックまたはその他のデータ構造上)に保存され、秒スレッドのレジスタ状態は、以前に保存された場所から復元されます。 RAMは十分に速く、これらのスイッチの数千が1秒で発生する可能性がありますが、スレッドを不必要に交換するとパフォーマンスに影響を与える可能性があるほど十分な時間がかかります。

もう1つの非常に一般的な発生はローカル変数です。ローカル変数が十分な期間にわたって使用されている場合、レジスタの外側に存在することはありません。ただし、多くの場合、ローカル変数をレジスタからメモリの場所に保存する必要がある場合があります。そうするため、他の値をレジスタにロードして操作できるようにする必要があります。実際には、地元の人々だけでなく、ほとんどすべての変数でも同じことが起こります(しかし、地元の人が記憶に存在することはない可能性がはるかに高くなります)。

それは非常に複雑な質問であり、答えはあなたのCPUアーキテクチャに依存します。

古き良き時代には、あなたは正しかった - 確かにいくつかの汎用登録簿がありました。今日、CPUとコンパイラはゲームをプレイしています」3カードモンテ「あなたの汎用を使用すると、ようなテクニックを通して登録します 登録の名前を記録します.

単純なアーキテクチャでは、コンテキストスイッチが発生したときにレジスタが[キャッシュ]メモリにコピーされることは事実ですが、 SMT OSを「愚か者」にして、実際よりも多くのコアがあると考えています。

しかし、あなたの質問に対する最も一般的な答えは、データがレジスタに移動して出入りすることです。 多くの. 。そして、それが、特定のアセンブリプログラムで見られる指示の多くが「MOV」指示である理由です。 CPUとコンパイラのデザイナーは、メインメモリ(遅い)からレジスタにデータを移動しないように、デザインを最適化するために多くの時間とお金を費やします。データを可能な限りキャッシュしようとします。この多数の「MOV」命令は、メモリレイテンシとバスの速度がコンピューター全体のパフォーマンスに非常に重要である理由です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top