26

SMP(Symmetericマルチプロセッサ/マルチコア)マシンで割り込みはどのように処理されますか?メモリ管理ユニットが1つ以上ありますか?

異なるコアで実行されている2つのスレッドAとBが、ページテーブルにないメモリページに(同時に)接触するとします。この場合、ページフォールトが発生し、メモリから新しいページが取り込まれます。

発生する一連のイベントは何ですか?メモリ管理ユニットが1つある場合、ページフォールトはどのコアに転送されますか?カーネルはそれをどのように処理しますか?カーネルの複数のインスタンスがあり、それぞれが異なるコアで実行されていますか?もしそうなら、それらはページフォールト処理などのイベントでどのように同期しますか?

4

5 に答える 5

11

まあ、それは特定のアーキテクチャに依存しますが、私がインテルのドキュメントから覚えていることから...

割り込みの主な原因は2つあります。

  • 内部:これらはCPU自体によって生成されます。障害、トラップ、ソフトウェア割り込みなどが含まれます。
  • 外部:これらは、周辺機器によって生成されるハードウェア割り込みです。

内部割り込みは、それを生成したCPUに常に配信されます。外部のものは、任意のコアに送信されます。

最近のモデルでは、古い割り込み駆動システムの代わりにバスのようなシステムを使用して割り込みを配信することもできますが、このモデルが現在のOSで使用されているかどうかは無視します。

もちろん、MMUについては、各コアに独自のコアがありますが、通常、OSによって同じセグメントが強制されるため、対称的に使用できます。物理メモリと仮想メモリ間のマッピングのほとんどは実際にはメモリ内にあり、それは常に共有されていることに注意してください。

あなたの例のシーケンスについて:

  • ページフォールトは、それを生成したコアに転送されます。
  • カーネルは、共有ロックなどで保護されているMMUテーブルを更新します。
  • いいえ、仮想化のモデルを適用しない限り、通常、カーネルは1つだけです。
  • これらは、共有ロックまたは同様の構造を使用して同期します。両方のコアが同じページで同時に障害を起こした場合...実際には大したことではありません。
于 2012-04-19T19:32:37.133 に答える
8

マルチコア/マルチプロセッサアーキテクチャでは、APICを使用して割り込みをコア/プロセッサにルーティングします。名前が示すように、APICは必要に応じてルーティングを行うようにプログラムできます。

カーネルの同期について:これはカーネル/OSによって異なります。ロック付きのスキームを使用するか(ただし、非キャッシュコヒーレントアーキテクチャではIPIが必要になる場合があります)、すべてのコアでカーネルを実行し、ある種の明示的なカーネル間通信を使用するという提案されたアプローチを使用することもできます。

Barrelfishは、複数のカーネルを実行しているOSの例です。この種のアーキテクチャに興味がある場合は、「マルチカーネル:スケーラブルなマルチコアシステム用の新しいOSアーキテクチャ」という論文を読むことをお勧めします。

于 2012-04-19T19:32:45.833 に答える
5

各プロセッサには、トランスレーションルックアサイドバッファを備えた独自のメモリ管理ユニットがあります。これが必要なのは、各コアが異なるアドレス空間を持つ異なるプロセスを実行している可能性があるためです。

複数のコアは、同時に割り込み/例外を独立して処理できます。したがって、カーネルで同時に実行されている複数の同時割り込みコンテキストが存在する可能性があります。

ページフォールトやゼロ除算などの例外は、そのプロセッサが実行していることに関係するため、常に発生した同じプロセッサで処理されます。

外部割り込みは通常、静的または動的に何らかの方法でプロセッサにマッピングできるようにする、ある種のスイッチングファブリックを通過します。たとえば、PCタイプのハードウェアの「APIC」。

ファブリックが十分に洗練されている場合は、その場で別のコアをターゲットにして割り込みを再プログラムできます。

アーキテクチャによって異なります。たとえば、単純なアーキテクチャでは、すべての外部割り込みを1つのコアに結び付けることができます。しかし、それはあまり対称的ではありません。IRQロードバランシングは許可されません。

(また、すべてのプロセッサで特定の外部割り込みを発生させると便利です。この例はタイマー割り込みです。すべてのコアに独自の割り込みタイマーがある場合、スケジューラでのタイムスライスの処理は対称的です。特別な場合の処理​​はありません。 1つのメインコアと他のコアに対して割り込みが発生し、コアはスケジューラコードを実行し、現在のタスクのタイムクォンタムがアップしている場合は、そのコアで実行する別のタスクを選択します。)

于 2012-04-19T19:35:30.020 に答える
1

各論理CPU(つまり、CPUコア)には独自のcr3レジスタがあり、ページング構造へのポインタを処理します。2つのページフォールトは、次のいずれかで発生する可能性があります。

  • 同じプロセスのスレッドで
  • 異なるプロセスのスレッドで

それらが異なるプロセスのスレッドである場合、問題はありません。これの特定のLinuxの実装が何であるかはわかりませんが(はい、「linux」としてタグ付けされていることは知っています)、SMP環境で仮想メモリを管理するための2つの一般的なアルゴリズムがあります。

  • 各コアは、独自の空き物理ページのリストを保持し、独自のリストのすべてのページが割り当てられたときに、さらにいくつかを要求します
  • すべてのコアは、ある種のロック(通常はスピンロックで十分です)で保護された同じ空きページのリストを使用しますが、これはもちろん遅い解決策です

同じコード(#PFハンドラー)を2つの異なるコアで同時に実行できますが、これは問題ではありません。スレッドが2つの異なるVAS1を使用する場合それらのページフォールトは対称的に処理されます。単一のVAS内でページフォールトが発生した場合でも、同じページへのアクセスによって#PFが発生するまで、問題はありません。このような場合、VASの各ページはスピンロックで保護する必要があります(または、特定のVASの#PFだけを単一のロックで保護できます。これにより、メモリオーバーヘッドが削減されますが、2つの#PFハンドラーを同時に実行する可能性がなくなります)。

この回答によると、NUMAシステムでのみ、各CPUコアに独自のMMUがあります。他のシステムでは、すべての物理プロセッサに独自のMMUと、レジスタのさまざまな値によって参照されるさまざまなページング構造を処理するTLBがありcr3ます。


1.VAS=仮想アドレス空間

于 2012-04-19T19:34:24.230 に答える
0

「カーネルの複数のインスタンス」を取得できませんでした。通常、カーネルルールはすべてです。つまり、インスタンスがないということです。代わりに、カーネルを、アプリケーションにサービスを提供するグローバルなリアクティブシステムと考える必要があります。

私の知る限り、メモリの受け渡しは1ユニットであり(各コアには独自の割り込みベクトルがあります)、ページはを使用してロックされるpage_table_lockため、ページの取得はロック順に1回だけ実行されます。

**編集:他のコメントを見た後、私の答えは時代遅れになる可能性があります:とにかくあなたはチェックする必要があります:http://www.xml.com/ldd/chapter/book/ch13.html

于 2012-04-19T19:34:45.877 に答える