22

私は共有メモリ アプリケーションを使用しており、次のコマンドを使用してセグメントを削除しています。

 ipcrm -M 0x0000162e (this is the key)

ipcsしかし、実行すると同じセグメントが表示されますが、キーが 0x0000000 であるため、正しいことを行っているかどうかはわかりません。では、メモリ セグメントは本当に削除されているのでしょうか。アプリケーションを数回実行すると、次のようにキー 0x000000 を持つさまざまなメモリ セグメントが表示されます。

 key        shmid      owner      perms      bytes      nattch     status
 0x00000000 65538      me         666        27         2          dest 
 0x00000000 98307      me         666        5          2          dest 
 0x00000000 131076     me         666        5          1          dest
 0x00000000 163845     me         666        5          0

実際に何が起こっているのですか?メモリセグメントは本当に削除されていますか?

編集:問題は、受け入れられた回答で以下に述べたように、共有メモリを使用する2つのプロセスがあり、すべてのプロセスが閉じられるまでメモリセグメントが消えないことでした。

4

2 に答える 2

24

UNIX (AIX と HPUX、Linux で共有メモリを使用したことがないことは認めます) 時代から、削除は単にブロックを新しいクライアントがアタッチできないとマークするだけだったことをぼんやりと覚えています。

関連付けられているプロセスがなくなった後、ある時点でのみ物理的に削除されます。

これは、削除される通常のファイルと同じです。ディレクトリ情報は削除されますが、ファイルの内容は、最後のプロセスがファイルを閉じた後にのみ消えます。これにより、ログ ファイルが削除された後でも、プロセスがまだログ ファイルに書き込みを行っているため、ログ ファイルがファイル システム上のスペースをますます占有するようになることがあります。 i ノードに) とファイルの内容 (i ノード自体)。

出力から、4 つのうち 3 つにまだプロセスが接続されていることがわかります。ipcsそのため、それらのプロセスが共有メモリ ブロックから切り離されるまで、プロセスはどこにも移動しません。もう 1 つは、おそらく何らかの「スイープ」関数がクリーンアップするのを待っていますが、それはもちろん、共有メモリの実装に依存します。

適切に作成された共有メモリ (またはログ ファイル) のクライアントは、この状況が一時的なものであり、ソフトウェアの動作に影響を与えないように、定期的に再接続 (またはロール オーバー) する必要があります。

于 2008-12-29T22:27:41.903 に答える
12

次のコマンドを使用したとのことです

ipcrm -M 0x0000162e (this is the key)

ipcrmのマニュアルページから

 -M shmkey
         Mark the shared memory segment associated with key shmkey for
         removal.  This marked segment will be destroyed after the
         last detach.

したがって、-Mオプションの動作は、観察したとおりに機能します。つまり、最後のデタッチ後にのみセグメントが破棄されるように設定します。

于 2008-12-29T22:52:22.307 に答える