Удаление разделяемой памяти с помощью ipcrm в Linux

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

 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 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам