0

execve は、動的に割り当てられた既存のメモリを破棄することを知っています。私の仕事は、バイナリを呼び出し、共有バッファを使用して通信する C プログラムを作成することです。ここで重要なのは効率です。バッファーのサイズは比較的小さいため、rpc やシステム コール (shmat など) の使用はできるだけ避けたいと考えています。

以前は、C プログラムでバッファを作成し、クローン (CLONE_VM フラグを設定) を使用してから、バイナリへの exec 呼び出しを行っていました。exec がイメージを置き換えるため、明らかにこれは機能しませんでした。

セットアップがどれほど効率的であるかについては心配していません。私の目標は、セットアップが完了したら、最も効率的な通信システムを構築することです。

同じアドレス空間内でバイナリを実行して、malloc されたメモリ領域を共有できる方法がない限り、shmget と shmat を使用します (実行されたバイナリ内から共有メモリをアタッチします)。

共有メモリを実現するためのより効率的な方法はありますか?

4

1 に答える 1

2

あなたの質問の問題文は整形式ではありません。shmatは ごとに 1 回だけ呼び出されるためexec、そのコストはプロセスの存続期間にわたって償却されます。あなたのコメントではexec、別のプログラムを使用する必要があると述べているため (理由は不明です)、スレッドは終了しています。

に関連付けられた共有メモリを使用しshmatてメッセージを渡すと、他の手段で共有されるメモリよりも大きなペナルティが発生するのではないかと心配しています。この恐れはほとんど根拠のないものです。他の動的に割り当てられたメモリと同じように共有メモリを使用しますが、アドレス オフセットはそれに接続されているプロセスごとに異なる可能性があることに注意してください。

要件や問題のパラメーターを明示的に述べていませんが、コメントでは、コンテキストスイッチを発生させずに2つのプロセス間でメッセージを渡したいと述べています。これは、メッセージ キューが空の場合にコンシューマー スピンを待機させることで可能になります。ただし、これはコンシューマとプロデューサが異なるプロセッサで実行されている場合にのみ有効です。

いずれにせよ、私はこれらすべての問題を最終段階の最適化と考えています。まず、メッセージを正しく配信することに集中してください。次に、パフォーマンスが許容レベルでない場合、ボトルネックがどこにあるかを調べます。

于 2012-08-03T00:10:18.383 に答える