しかし、私は混乱しています。
質問:
OS が自分で処理するのか
、変数を _Uncached として宣言するなどのように、変数がキャッシュに入らないようにプログラマーがプログラムを作成する必要があるのかどうか。
よろしく
学習者
しかし、私は混乱しています。
質問:
OS が自分で処理するのか
、変数を _Uncached として宣言するなどのように、変数がキャッシュに入らないようにプログラマーがプログラムを作成する必要があるのかどうか。
よろしく
学習者
明確にするために:
volatile
は C の概念であり、レジスターで「コンパイラーが生成した」キャッシュされたバージョンを使用したり、特定のコードを最適化したりするのではなく、毎回メモリーから変数をフェッチするようにコンパイラーに指示します。
ここで混乱を引き起こしているのは、CPU キャッシュとソフトウェア キャッシュ (別名レジスタ内の変数) です。
CPU/ハードウェア キャッシュはプログラムに対して 100% 透過的であり、ハードウェアは 100% 同期されていることを確認します。load
from memoryを発行し、データが CPU キャッシュから取得された場合、アドレス指定されたメモリにあるのと同じデータであるため、心配する必要はありません。
コンパイラは、頻繁に使用される変数をレジスタに「キャッシュ」することを決定する場合があります。これは、ハードウェアがそれらを認識していないため、メモリと同期しなくなる可能性があります。これは、volatile
キーワードが防止するものです。一般的な例:
int * lock;
while (*lock) {
// do work
// lock mot modified or accessed here
}
lock
最適化コンパイラは、ループ内で使用していないことを認識し、これを次のように変換します。
if (*lock)
while (true) {
// do work
}
lock
これは明らかに、たとえば別のスレッドによって変更される場合に必要な動作ではありません。SO これを防ぐために volatile とマークします。
volatile int * lock;
while (*lock) {
// do work
}
これで少しわかりやすくなることを願っています。