7

私はこれを少しグーグルで調べましたが、明確な答えを見つけることができなかったので、誰かがWindows VS Linuxの共有メモリセグメントについて洞察を持っていることを願っています.

Linux では、IPC 用の共有メモリを作成する方法が 2 つあります。共有メモリ セグメント (shmget など) とメモリ マップ ファイル (mmap) です。私の簡単な理解から、mmap ではマップする OS のどこかに実際のファイルが必要ですが、共有メモリ セグメントは、プロセスによってアタッチできるメモリ内の名前ベースのセグメントにすぎません。

Windowsでは、実際のファイルがどこかに浮かんでいる必要があるメモリマップファイルに相当するものしかないようです。

私の質問: これは実際に Windows で唯一の種類の共有メモリですか、それとも非ファイル ベースの共有メモリ セグメントを作成するための API がありますか。

4

3 に答える 3

5

Unix mmap()API は実質的にCreateFileMapping/ MapViewOfFileWindows API と同等です。どちらもファイルをマップしたり、スワップ デバイス (存在する場合) によってバックアップされる共有 (匿名) マップを作成したりできます。実際のところ、glibc は、要求されたメモリ サイズが十分に大きい場合、匿名mmap()を使用して実装します。malloc()

Windows は、Linux では実装されていない、実行可能ファイル内の共有データ セクションという 1 つの追加メカニズムをサポートしています。まず、 を使用して名前付きデータ セクションを作成し、#pragma data_seg(".somename")その中に共有変数を配置します。次に、次のオプションを使用して、セクションを読み取り/書き込み/共有としてマークするようにリンカに指示します/SECTION:.somename,RWS。プロセス全体はMSDNで説明されています。これは、EXE または DLL ファイルのいずれかの同じモジュールのコピーに対してのみ機能します。同じモジュールとは、同じファイル システムの場所にある同じファイルを意味します。同じ実行可能ファイルの異なるコピーから作成されたが、別の場所にあるプロセスは、他の名前付きセクションを共有として認識しません。

于 2013-05-27T10:35:57.880 に答える
1

はい、Windows で非ファイルベースの共有メモリ セグメントを使用できます。

#pragma comment(linker, "/SECTION:.shared,RWS")
#pragma data_seg(".shared")
int g_iShared = 0;
#pragma data_seg()
于 2016-08-19T09:11:47.620 に答える