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