Отличия семафоров System V и Posix
Каковы компромиссы между использованием System V и семафором Posix?
5 ответов
От О'Рейли:
- Одно заметное отличие между реализациями семафоров System V и POSIX состоит в том, что в System V вы можете контролировать, насколько можно увеличить или уменьшить количество семафоров; тогда как в POSIX количество семафоров увеличивается и уменьшается на 1.
- Семафоры POSIX не разрешают манипулировать разрешениями семафоров, тогда как семафоры System V позволяют изменять разрешения семафоров на подмножество исходных разрешений.
- Инициализация и создание семафоров являются атомарными (с точки зрения пользователя) в семафорах POSIX.
- С точки зрения использования семафоры System V неуклюжи, в то время как семафоры POSIX просты
- Масштабируемость семафоров POSIX (с использованием безымянных семафоров) намного выше, чем семафоров System V. В сценарии пользователь / клиент, где каждый пользователь создает свои собственные экземпляры сервера, было бы лучше использовать семафоры POSIX.
- Семафоры System V при создании объекта семафора создают массив семафоров, тогда как семафоры POSIX создают только один. Благодаря этой функции создание семафора (с точки зрения занимаемой памяти) в семафорах System V обходится дороже по сравнению с семафорами POSIX.
- Говорят, что производительность семафоров POSIX лучше, чем семафоров на основе System V.
- Семафоры POSIX предоставляют механизм для семафоров всего процесса, а не семафоров всей системы. Таким образом, если разработчик забывает закрыть семафор, при выходе из процесса семафор очищается. Проще говоря, семафоры POSIX предоставляют механизм для непостоянных семафоров.
Две основные проблемы с общими / именованными семафорами POSIX, используемыми в отдельных процессах (не потоках): Семафоры POSIX не предоставляют механизма для пробуждения ожидающего процесса, когда другой процесс умирает, удерживая блокировку семафора. Это отсутствие очистки может привести к появлению семафоров-зомби, которые вызовут любой другой или последующий процесс, который пытается использовать их для взаимоблокировки. Также нет способа POSIX перечислить семафоры в ОС, чтобы попытаться идентифицировать и очистить их. Раздел POSIX на SysV IPC определяет инструменты ipcs и ipcrm для перечисления глобальных ресурсов SysV IPC и управления ими. Для POSIX IPC такие инструменты и даже механизмы не указаны, хотя в Linux эти ресурсы часто можно найти в /shm. Это означает, что сигнал KILL неправильному процессу в неподходящее время может заблокировать всю систему взаимодействующих процессов до перезагрузки.
Еще одним недостатком является использование семантики файлов для семафоров POSIX. Это означает, что может быть несколько общих семафоров с одинаковыми именами, но в разных состояниях. Например, процесс вызывает sem_open, затем sem_unlink перед sem_close. Этот процесс может по-прежнему использовать семафор, так же как и отсоединение открытого файла перед его закрытием. Процесс 2 вызывает sem_open для одного и того же семафора между вызовами sem_unlink и sem_close процесса 1 и (согласно документации) получает новый семафор с тем же именем, но в другом состоянии, чем процесс 1. Два общих семафора с тем же именем работать независимо друг от друга наносит ущерб цели общих семафоров.
Ограничение, указанное выше, делает общие семафоры POSIX непригодными для использования в реальной системе без гарантии того, что неуловимые сигналы никогда не будут отправлены. Ограничение два может быть смягчено путем тщательного кодирования, предполагая контроль над всем кодом, который будет использовать данный семафор. Честно говоря, более чем удивительно, что они сделали это стандартом, как они есть.
Я знаю, что это старо, но в интересах тех, кто все еще читает эту любезность Google, причина № 1, которую я нахожу для использования семафоров System V поверх семафоров POSIX (системный уровень), заключается в возможности получения ресурса семафора таким образом, чтобы ядром автоматически возвращается. Неважно, как завершится процесс.
Я согласен с тем, что множественные (атомарные) операции семафоров используются редко (хотя они могут быть полезны во время подготовки), и что интерфейс System V является странным, но просто невозможно надежно добиться такой же семантики очистки с семафорами POSIX.
Интересно, что заставляет людей создавать плохие API, такие как семафоры System V! Если у вас нет очень веских причин использовать семафоры System V (например, атомарные операции с множественным приращением-уменьшением за один шаг), вы должны придерживаться именованных семафоров POSIX.
В связанной статье обсуждается, что не так и не интуитивно понятно с семафорами System V.
Что касается производительности, семафоры POSIX основаны на фьютексе под Linux. Это делает их гораздо более эффективными, чем семафоры SYSV.
Семафоры SYSV требуют систематических системных вызовов для операций P()/V(). Таким образом, это систематически запускает пользователя для переключения контекста пространства ядра и наоборот.
В версии POSIX базовый фьютекс заставляет вызывающую программу оставаться в пользовательском пространстве, если на семафоре нет конкуренции (операции P()/V() выполняются в пользовательском пространстве с доступными атомарными операциями). Переключение в режим ядра происходит только в случае конфликта. Таким образом, в приложениях, использующих семафоры POSIX, количество переключений контекста пространства ядра и, наоборот, меньше. Это делает их быстрее.