10.12. Использование семафоров несколькими процессами

10.12. Использование семафоров несколькими процессами

Правила совместного использования размещаемых в памяти семафоров несколькими процессами просты: сам семафор (переменная типа semt, адрес которой является первым аргументом sem_init) должен находиться в памяти, разделяемой всеми процессами, которые хотят его использовать, а второй аргумент функции sem_init должен быть равен 1.

ПРИМЕЧАНИЕ

Эти правила аналогичны требованиям к разделению взаимного исключения, условной переменной или блокировки чтения-записи между процессами: средство синхронизации (переменная типа pthread_mutex_t, pthread_cond_t или pthread_rwlock_t) должно находиться в разделяемой памяти и инициализироваться с атрибутом PTHREAD_PROCESS SHARED.

Что касается именованных семафоров, процессы всегда могут обратиться к одному и тому же семафору, указав одинаковое имя при вызове sem_open. Хотя указатели, возвращаемые sem_open отдельным процессам, могут быть различны, все функции, работающие с семафорами, будут обращаться к одному и тому же именованному семафору.

Что произойдет, если мы вызовем функцию sem_open, возвращающую указатель на тип sem_t, а затем вызовем fork? В описании функции fork в стандарте Posix.1 говорится, что «все открытые родительским процессом семафоры будут открыты и в дочернем процессе». Это означает, что нижеследующий код верен:

sem_t *mutex; /* глобальный указатель, копируемый, при вызове fork() */

/* родительский процесс создает именованный семафор */

mutex = Sem_open(Px_ipc_name(NAME), O_CREAT | O_EXCL, FILE_MODE, 0);

if ((childpid = Fork()) == 0) {

 /* дочерний процесс */

 …

 Sem_wait(mutex);

 …

}

/* родительский процесс */

Sem_post(mutex);

ПРИМЕЧАНИЕ

Причина, по которой следует аккуратно относиться к передаче семафоров при порождении процессов, заключается в том, что состояние семафора может храниться в переменной типа sem_t, но для его работы может требоваться и другая информация (например, дескрипторы файлов). В следующей главе мы увидим, что семафоры System V однозначно определяются их целочисленными идентификаторами, возвращаемыми функцией semget. Любой процесс, которому известен идентификатор, может получить доступ к семафору. Вся информация о семафоре System V хранится в ядре, а целочисленный идентификатор просто указывает номер семафора ядру.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

12.3.1 Определение семафоров

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

12.3.1 Определение семафоров Семафор представляет собой обрабатываемый ядром целочисленный объект, для которого определены следующие элементарные (неделимые) операции:• Инициализация семафора, в результате которой семафору присваивается неотрицательное значение;•


12.3.2 Реализация семафоров

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

12.3.2 Реализация семафоров Дийкстра [Dijkstra 65] показал, что семафоры можно реализовать без использования специальных машинных инструкций. На Рисунке 12.6 представлены реализующие семафоры функции, написанные на языке Си. Функция Pprim блокирует семафор по результатам проверки


10.16. Реализация с использованием семафоров System V

Из книги Системное программирование в среде Windows автора Харт Джонсон М

10.16. Реализация с использованием семафоров System V Приведем еще один пример реализации именованных семафоров Posix — на этот раз с использованием семафоров System V. Поскольку семафоры System V появились раньше, чем семафоры Posix, эта реализация позволяет использовать последние в


11.7. Ограничения семафоров System V

Из книги Справочник по PHP автора

11.7. Ограничения семафоров System V На семафоры System V накладываются определенные системные ограничения, так же, как и на очереди сообщений. Большинство этих ограничений были связаны с особенностями реализации System V (раздел 3.8). Они показаны в табл. 11.1. Первая колонка содержит


Использование семафоров

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

Использование семафоров Классической областью применения семафоров является управление распределением конечных ресурсов, когда значение счетчика семафора ассоциируется с определенным количеством доступных ресурсов, например, количеством сообщений, находящихся в


Ограниченность семафоров

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Ограниченность семафоров В Windows существуют важные ограничения, касающиеся реализации семафоров. Например, каким образом поток может потребовать, чтобы счетчик семафора уменьшился на 2? Для этого поток мог бы организовать ожидание два раза подряд, как показано ниже, но


Работа с несколькими массивами

Из книги Разработка ядра Linux автора Лав Роберт

Работа с несколькими массивами array_diffОпределение исключительного пересечения массивов.Синтаксис:array array_diff(array arr1, array arr2 [, array ...])Данная функция возвращает массив, который содержит значения, имеющиеся только в массиве arr1 ( и не имеющиеся в любых других). При этом индексы


26.6.1. Создание множества семафоров

Из книги автора

26.6.1. Создание множества семафоров Для создания множества семафоров или подключения к уже существующему множеству используется системный вызов semget():int semget(key_t key, int nsems, int semflg);Первый аргумент — это ключ IPC, который, как обычно, создается системным вызовом ftok(). Он


4.4.3. Взаимоблокировки исключающих семафоров

Из книги автора

4.4.3. Взаимоблокировки исключающих семафоров Исключающие семафоры являются механизмом, позволяющим одному потоку блокировать выполнение другого потока. Это приводит к возникновению нового класса ошибок. называемых взаимоблокировками или тупиковыми ситуациями. Смысл


4.4.4. Неблокирующие проверки исключающих семафоров

Из книги автора

4.4.4. Неблокирующие проверки исключающих семафоров Иногда нужно, не заблокировав программу, проверить, захвачен ли исключающий семафор. Для потока не всегда приемлемо находиться в режиме пассивного ожидания, ведь за это время можно сделать много полезного! Функция


5.2.1. Выделение и освобождение семафоров

Из книги автора

5.2.1. Выделение и освобождение семафоров Функции semget() и semctl() выделяют и освобождают семафоры, функционируя подобно функциям shmget() и shmctl(). Первым аргументом функции semget() является ключ, идентифицирующий группу семафоров; второй аргумент — это число семафоров в группе;


5.2.2. Инициализация семафоров

Из книги автора

5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле


5.2.4. Отладка семафоров

Из книги автора

5.2.4. Отладка семафоров С помощью команды ipcs -s можно получить информацию о существующих группах семафоров. Команда ipcrm sem позволяет удалить заданную группу, например:% ipcrm sem


Создание и инициализация семафоров

Из книги автора

Создание и инициализация семафоров Реализация семафоров зависит от аппаратной платформы и определена в файле <asm/semaphore.h>. Структура struct semaphore представляет объекты типа семафор. Статическое определение семафоров выполняется следующим образом.static DECLARE_SEMAPHORE_GENERIC(name,


Использование семафоров

Из книги автора

Использование семафоров Функция down_interruptible() выполняет попытку захватить данный семафор. Если эта попытка неудачна, то задание переводится в состояние ожидания с флагом TASK_INTERRUPTIBLE. Из материала главы 3 следует вспомнить, что такое состояние процесса означает, что задание


Сравнение спин-блокировок и семафоров

Из книги автора

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