私はshmget(2)を介してLinuxシステム上で共有メモリを割り当てるC++アプリケーションを持っています。共有メモリに保存するデータは定期的に増加し、realloc()が通常のメモリを増やす方法と同様に共有メモリのサイズを変更したいと思います。これを行う方法はありますか?私は、IBMのサイトでSHM_SIZEコマンドについて説明している文書を見つけましたが、LinuxおよびBSDのマンページには、Linux固有のセクションでさえも、それがありません。shmctlでLinux共有メモリのサイズを変更できますか?
答えて
簡単な答え:簡単な方法はありません。
理由はかなり論理的です。共有メモリは、すべてのプロセスの仮想空間に個別に接続されています。各プロセスには独自の仮想アドレス空間があります。各プロセスは、にセグメントを自由にアタッチすることができます(文字通り、アライメントではいくつかの制約があります)任意のアドレス。システムがどのようにして4MiBでエリアを拡張すると、このセグメントのすべての 'ユーザー'が同じ開始アドレスにあるビッグゲットブロックに適合することができると、システムはそれを保証できますか?
しかし、あなたはあきらめるべきではありません!あなたは創造的なことができます。実際のペイロードセグメントに関する情報を格納するヘッダーセグメントを持つアイデアを考え出すことができます。たとえば、ヘッダーセグメントのどこかに記載されているように、idがの既知のものと一致しない場合、ペイロードセグメントを再接続するように、すべてのプロセスをいくつかのルールに従わせることができます。。
アドバイス:だけオフセット、私はあなたがこれを知っている疑いがあるが、共有領域内のデータへのポインタを保持することはありません。
私はあなたの愚か者の一部を使用していただければ幸いです。
ありがとう - これは非常に役に立ちます! –
あなたの目的のために独自のメモリマネージャを書くことができるようです。概念は非常に単純です:
- あなたは共有メモリブロックを持っています。サイズは
N
バイトです。 - 共有メモリの新しいブロックを
2*N
サイズで割り当てます。 - メモリをあるブロックから別のブロックにコピーします。
- 古い共有メモリブロックを解放します。
- #2-4をいくつかのルーチンにラップして使用します。
私はそれ以上は何もしません。これはstd::vector
の実装方法です。ほとんどの場合、void *realloc()
は、新しいメモリブロックへのポインタを返します(ただし、拡張された古いブロックにはポインタを返しません)。
私はそうすることは、このタイプのメモリの '共有'プロパティが存在しないと考えています。 – GreenScape
- 1. 共有メモリセグメントをshmctlで削除する
- 2. Pythonで共有メモリのサイズを変更するには
- 3. Linuxの共有メモリ
- 4. POSIX共有メモリのサイズを変更します。動作例
- 5. 共有メモリからTensorflow変数を作成できますか?
- 6. 共有メモリをマップできません
- 7. これはLINUXの共有メモリに関するものです
- 8. 共有メモリの変数が
- 9. Linuxの物理メモリのサイズを変更する
- 10. 共有メモリのオーバーレイは何ですか?
- 11. 共有メモリでのバンクコンフリクトフリーアクセス
- 12. 可変行列サイズのCUDAでの行列乗算と共有メモリの使用
- 13. Win32共有メモリからデータを取得できません
- 14. CとC++の間のLinux共有メモリは実現可能ですか?
- 15. uda共有メモリ上書き?
- 16. メインプログラムのメモリをLinuxのスレッドと共有するには
- 17. WPF - クロムのないサイズ変更可能な共有ベースウィンドウクラスを作成できますか?
- 18. 共有データベース/メモリ
- 19. RDMAメモリ共有
- 20. 共有ホスティングで「ft_min_word_len」を変更することはできますか?
- 21. Linuxで共有メモリを使用する場合のセグメンテーションフォールト(コアダンプ)の修正方法
- 22. Cの共有メモリ(shmget/shmat)の変更方法は?
- 23. OpenCLの共有メモリ
- 24. GPUの共有メモリはMatlabでどのように使用できますか?
- 25. 共有メモリ内のセマフォ、プロセス、インクリメント変数
- 26. モジュール間でメモリを共有する
- 27. linuxの共有フォルダからIIS7サイトを実行できない
- 28. 複数のアプリケーションインスタンス間でメモリを共有
- 29. アドレスが共有メモリにあるかどうかを確認できますか?
- 30. Linuxの共有メモリセグメンテーションフォールト
をインスピレーションとして、http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/quick_guide.html - 具体的には 'managed_shared_memory'を見てください。これは'共有メモリ内のベクトルです... – Nim