マルチコアCPUにおけるプロセス間共有メモリについて
マルチコアCPU環境でのプロセス間共有メモリについての疑問です。
まずマルチコアCPUの構造として
+----------+ +----------+ | コア1 | | コア2 | +----------+ +----------+ |キャッシュ | |キャッシュ | +----------+-+----------+ | メモリ | +-----------------------+
というように、コアごとにキャッシュがあります。
ここで2つのアプリケーション(App1とApp2)の間用の共有メモリを考えます。
App1がコア1で動作、App2がコア2で動作するとします。
何も考えなければApp1が共有メモリに書き込んだとしても、
App2にはその内容を読み取れない可能性があります。
App1が書き込んだ内容は、まだコア1のキャッシュにとどまっている場合もあれば、
たとえメモリに書き込まれたとしてもコア2のキャッシュに充てんされていないかもしれません。
この問題を解消するための方策として、次の2つが考えられます。
1. キャッシュを通さずにメモリに書いて、キャッシュを通さずメモリから読みだす
2. キャッシュを通すがあるまとまった単位でキャッシュからメモリに書き込んで、
読み込む場合は、メモリからキャッシュに充てんする。
1の方策は遅いですが、なにも考えずにできます。
2の方策は速いですが、キャッシュ操作が必要になります。
質問:
Windows, Linuxで実際のところはどうなっているのか?
Windowsでの方策1
CreateFileMapping()でflProtect引数に
A.SEC_NOCACHEを指定した場合にのみ
キャッシュを通さずメモリに直接アクセスされる。
B.指定しなくても
キャッシュを通さずメモリに直接アクセスされる。
C.その他
のいずれでしょうか?
Windowsでの方策2
CreateFileMapping()でflProtect引数にSEC_NOCACHEを指定しないとキャッシュ経由になる?
キャッシュからメモリへの書き込み、メモリからキャッシュへの充てんは
FlushViewOfFile()を使う?
Linuxでの方策1
mmap()またはshm_open()で返されるアドレスへのアクセスは
常にキャッシュを通さずにメモリに書いて、キャッシュを通さずメモリから読みだす?
Linuxでの方策2
mmap()またはshm_open()で返されるアドレスへのアクセスは常にキャッシュ経由のアクセスで、
キャッシュからメモリへの書き込み、メモリからキャッシュへの充てんはmsync()を使う?