Удаление разделяемой памяти с помощью ipcrm в Linux - PullRequest
20 голосов
/ 30 декабря 2008

Я работаю с приложением с общей памятью, и для удаления сегментов я использую следующую команду:

 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

Что на самом деле происходит? Сегмент памяти действительно удален?

Редактировать: Проблема заключалась в том, как было сказано ниже в принятом ответе, что два процесса использовали общую память, пока все процессы не были закрыты, сегмент памяти не исчезнет. 1012 *

Ответы [ 2 ]

21 голосов
/ 30 декабря 2008

Я смутно помню из моих UNIX (AIX и HPUX, я признаю, что никогда не использовал совместно используемую память в Linux), что удаление просто помечает блок как больше не доступный для новых клиентов.

Он будет физически удален только после того, как к нему больше не присоединятся процессы.

Это то же самое, что и для обычных файлов, которые удаляются, информация об их каталогах удаляется, но содержимое файла исчезает только после того, как последний процесс закрывает его. Это иногда приводит к файлам журналов, которые занимают все больше места в файловой системе, даже после того, как они удалены, поскольку процессы все еще пишут в них, вследствие «отрыва» между указателем файла (ноль или более записей каталога указывают в индекс) и содержимое файла (сам индекс).

Из вывода ipcs видно, что 3 из 4 все еще имеют присоединенные процессы, поэтому они не будут никуда идти, пока эти процессы не отсоединятся от блоков общей памяти. Другой, вероятно, ожидает какой-то функции «очистки», чтобы очистить ее, но это, конечно, будет зависеть от реализации совместно используемой памяти.

Хорошо написанный клиент разделяемой памяти (или файлов журнала в этом отношении) должен периодически повторно присоединяться (или переворачиваться), чтобы гарантировать, что эта ситуация временна и не влияет на работу программного обеспечения.

12 голосов
/ 30 декабря 2008

Вы сказали, что использовали следующую команду

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 делает именно то, что вы наблюдали, т. Е. Уничтожать сегмент только после последнего отсоединения.

...