1. ホーム
  2. concurrency

[解決済み] メモリーフェンスとは?

2022-06-02 05:01:41

質問

明示的なメモリフェンスの使用とはどういう意味ですか?

どのように解決するのですか?

パフォーマンスを向上させるために、最近の CPU は、利用可能なシリコンを最大限に活用するために、しばしば命令を順番外に実行します (メモリの読み取り/書き込みを含む)。ハードウェアは命令の整合性を強制するため、実行の単一スレッドではこのことに気づくことはありません。しかし、複数のスレッドまたは揮発性メモリ (たとえば、メモリ マップされた I/O) を使用する環境では、これは予測不可能な動作につながる可能性があります。

メモリフェンス/バリアは、メモリの読み取り/書き込みが期待通りの順序で行われることを意味する命令のクラスです。たとえば、「フル フェンス」は、フェンスの前のすべての読み取り/書き込みが、フェンスの後のものよりも先に実行されることを意味します。

メモリ フェンスはハードウェアの概念であることに注意してください。高レベルの言語では、私たちはミューテックスやセマフォを扱うのに慣れています。これらは、低レベルでメモリ フェンスを使用して実装することができ、メモリ バリアを明示的に使用する必要はありません。メモリバリヤを使用するには、ハードウェアアーキテクチャを注意深く研究する必要があり、アプリケーションコードよりもデバイスドライバでより一般的に見受けられます。

CPU の並べ替えはコンパイラの最適化とは異なりますが、その結果は似ています。望ましくない動作 (例: C 言語での volatile キーワードの使用) を引き起こす可能性がある場合は、コンパイラによる命令の並べ替えを阻止するために別の手段を講じる必要があります。