Подтвердить что ты не робот

Удаление общей памяти с помощью 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

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

Изменить: Проблема была - как сказано ниже в принятом ответе, - что в общей памяти было два процесса, пока весь процесс не был закрыт, сегмент памяти не исчезнет.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

ipcrm -M 0x0000162e (this is the key)

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