31313


マルチコアCPU環境でのプロセス間共有メモリについての疑問です。

まずマルチコアCPUの構造として、以下のようにコアごとにキャッシュがあります。

[code]

        +----------+ +----------+
        |  コア1   | |  コア2    |
        +----------+ +----------+
        |キャッシュ | |キャッシュ |
        +----------+-+----------+
        |        メモリ          |
        +-----------------------+
    
[/code]

ここで２つのアプリケーション(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()を使う？


CC BY-SA 4.0
2016-12-22T04:36:25.363
31309
2022-07-18T04:02:54.403
2022-07-18T04:02:54.403
3060
7844
question
linux windows cpu
マルチコアCPUにおけるプロセス間共有メモリについて


CPUキャッシュは[キャッシュコヒーレンシ](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B3%E3%83%92%E3%83%BC%E3%83%AC%E3%83%B3%E3%82%B7)により一貫性が保たれているため、特に気にする必要はありません。  
例えば無効化型キャッシュであれば、App1がコア1のキャッシュに書き込んだ時点で、コア1のキャッシュはコア2のキャッシュに対して当該アドレスの値が更新されたことを通知します。それを受けてコア2は当該アドレスのキャッシュ値を無効と見なします。App2がコア2にて当該アドレスの値を読み込もうとすると未キャッシュと見なされ改めてメモリから最新値を読み込みます。

* * *

質問及びコメントから共有メモリが特別な存在と捉えられているようですが、根本的に誤解されています。  
最近のアプリケーションはマルチスレッドが当然となっています。スレッドはプロセス内でメモリを共有して実行する単位であり、マルチスレッドとは常に共有メモリ状態となります。そのため、プロセッサーもOSもマルチスレッドおよび共有メモリを前提とした設計がなされています。


CC BY-SA 3.0
2016-12-22T05:54:55.980
31313
2016-12-25T22:11:08.260
2016-12-25T22:11:08.260
4236
4236
31309
answer


(1)メモリー共有やファイルのキャッシュはOSが提供する機能上の話。  
(2)L1、L2、L3各キャッシュやそれらの調停はCPU内の回路設計上の話。

です。両者はほぼ無関係なので混ぜて考えてはいけない概念ですね。


CC BY-SA 3.0
2016-12-22T05:58:25.680
31314
2016-12-22T05:58:25.680
3793
31309
answer