Совместная память и процесс Sempahores (IPC) - PullRequest
1 голос
/ 29 апреля 2010

Это выдержка из Advanced Liniux Programming:


Семафоры продолжают существовать даже после завершения всех использующих их процессов. Последний процесс, использующий набор семафоров, должен явно удалить его, чтобы в операционной системе не заканчиваются семафоры. Для этого вызовите semctl с идентификатор семафора, количество семафоров в наборе, IPC_RMID в качестве третьего аргумента, и любое значение semun союза в качестве четвертого аргумента (который игнорируется). эффективный идентификатор пользователя вызывающего процесса должен совпадать с идентификатором распределителя семафора (или звонящий должен быть root). В отличие от сегментов общей памяти, удаление семафора set приводит к немедленному освобождению Linux.


Если процесс выделяет общую память, и многие процессы используют ее и никогда не устанавливают ее удаление (с помощью shmctl), если все они завершаются, тогда общая страница продолжает оставаться доступной. (Мы можем видеть это с помощью ipcs).

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

Пока все хорошо (думаю, если нет, поправьте меня).

Что я не понимаю из этой цитаты, которую я сделал, так это то, что сначала говорится: «Семафоры продолжают существовать даже после завершения всех процессов, использующих их». а потом: «В отличие от сегментов разделяемой памяти, удаление набора семафоров приводит к немедленному освобождению Linux».

1 Ответ

2 голосов
/ 29 апреля 2010

Два утверждения не противоречат друг другу ...

Первое утверждение говорит, что семафор будет продолжать существовать до тех пор, пока какая-либо программа не удалит его явно (т.е. он не будет автоматически удален, когда последняя программа прекратит его использовать).

Второе утверждение говорит о том, что когда программа удаляет набор семафоров, linux немедленно освобождает набор семафоров (в отличие, скажем, от ожидания, пока все другие программы прекратят использовать его первым)

...