2013-03-24 2 views
12

Я смущен Linux man pages для shmctl(). Я использую следующую команду: shmctl (id , IPC_RMID , 0) для удаления общего сегмента. Кажется, что man pages противоречит самой жизни памяти.Удаление сегмента разделяемой памяти с помощью shmctl

man pages состояние:

IPC_RMID

Марк сегмент будет уничтожен. Сегмент будет фактически уничтожен только после того, как последний процесс отделит его (то есть, когда элемент shm_nattch shm_nattch ассоциированной структуры shmid_ds равен нулю). Вызывающий абонент должен быть владельцем или создателем или иметь привилегию. Если сегмент был помечен для уничтожения, то будет установлен флаг (нестандартный) SHM_DEST поля shm_perm.mode в связанной структуре данных, полученной по IPC_STAT.

Если я прав, то я считаю, что это означает, что если у вас есть два процесса, которые и крепят к разделяемой памяти (Назовём их Process1 и Process2), Process1 может создать общую память, прикрепить к нему, отрывать, уничтожить общий памяти и в конечном итоге прекратить работу. Тогда память будет существовать до тех пор, пока Process2 также не отсоединится.

Это правильно?

Во-вторых, то, что делает это заявление в man pages среднее:

Вызывающий должен гарантировать, что сегмент, в конечном счете разрушен; в противном случае его страницы, которые были сбойны, останутся в памяти или swap.

Это создает впечатление, что Process1, так как он ознаменовал сегмент для удаления, необходимо будет блокировать, пока все другие процессы не отделены, чтобы обеспечить память будет удален. Но это, похоже, противоречит сказанному выше. Я также не знаю, как это будет сделано (если это предполагается сделать), так что, если это так, не могли бы вы также объяснить, как я буду это делать.

ответ

15

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

Цель второго фрагмента состоит в том, чтобы напомнить вам, что в решении, использующем разделяемую память, необходимо, чтобы какой-либо процесс маркировал его для уничтожения или он останется в памяти/своп навсегда. Было бы неплохо использовать IPC_RMID сразу после создания сегмента.

Если вы не уверены, что успешно освободили память, вы можете использовать программу ipcs для отображения оставшихся сегментов.

Смежные вопросы