1

この投稿は、Windows 上の Linux での共有メモリのパフォーマンスの計算に関するものです。
私は Linux 開発の初心者です。
共有メモリからのパケット (サイズ 2048 バイト) がクライアント (プロセス 1) からサーバー (プロセス 2) に 1 秒間に転送される数を計算するクライアント サーバー アプリケーションを作成しました。

ウィンドウでは、
CreateFileMapping
OpenFileMapping
MapViewOfFile
関数を使用しています。共有メモリの同期には、クライアントとサーバーの両方で名前付きイベント (createevent) を使用しているため、共有メモリ ブロックで一度に読み取りまたは書き込み操作を実行できます。
また、構造内の循環バッファを共有メモリ ブロックとして使用しているため、サイズ 4096 の 512 共有ブロックになります。

    struct block{
     BYTE Data[4096];
      long amount;
    }
    struct MemBuffer{
      block m_Blocks[512];
       ...
       ...
    }

FIFO方式として機能するように、何らかのロジックが実装されています。

Linuxの場合、posix共有メモリAPI
shm_open
ftruncate
mmap を使用しています

共有メモリ ブロックは同じです (Windows の場合と同じ) 同期セマフォが使用されます

今のパフォーマンス

Windows カウントは 1 秒あたり 700000 パケットです
Linux カウントは名前付きセマフォを使用して 1 秒あたり 500000 パケットです
Linux カウントは名前なしセマフォを使用して 1 秒あたり 600000 パケットです

このアプリケーション全体での私の観察によると、オーバーヘッドは同期であるため、同期のためのより良いアプローチや、Linux の共有メモリの全体的なパフォーマンスを向上させる方法を誰かが提案できますか?

前もって感謝します

アップデート:

Windows 2003 サーバーと Red Hat Enterprise Linux 6.0 でデュアル ブート マシンを使用しています。マシン構成は次のとおりです Intel Quad Core with 2.4 Ghz , 4GB RAM

4

1 に答える 1

0

これらの方法は両方とも、ハードウェア レベルで同一のメモリ マッピングになるはずです (本当に不運でキャッシュの競合が発生しない限り)。そうです、あなたが見ている違いはセマフォの実装にあります。しかし、私の言葉を鵜呑みにしないでください。バッファを生成および消費する実験を行ってください。ただし、実際にバッファを読み書きすることはありません。同じ動作が得られるかどうかを確認してください。

高性能セマフォを持つライブラリはたくさんあります。boostなどのいずれかを試してください。

于 2012-05-30T04:21:58.657 に答える