10.16. Реализация с использованием семафоров System V
10.16. Реализация с использованием семафоров System V
Приведем еще один пример реализации именованных семафоров Posix — на этот раз с использованием семафоров System V. Поскольку семафоры System V появились раньше, чем семафоры Posix, эта реализация позволяет использовать последние в системах, где их поддержка не предусмотрена производителем.
ПРИМЕЧАНИЕ
Семафоры System V описаны в главе 11. Этот раздел можно пропустить при первом чтении, с тем чтобы вернуться к нему по прочтении 11 главы.
Начнем, как обычно, с заголовочного файла semaphore.h (листинг 10.36), который определяет фундаментальный тип данных sem_t.
Листинг 10.36. Заголовочный файл semaphore.h
//my_pxsem_svsem/semaphore.h
1 /* фундаментальный тип данных */
2 typedef struct {
3 int sem_semid; /* идентификатор семафора System V */
4 int sem_magic; /* магическое значение, если семафор открыт */
5 } mysem_t;
6 #define SEM_MAGIC 0x45678923
7 #ifdef SEM_FAILED
8 #undef SEM_FAILED
9 #define SEM_FAILED ((mysem_t *)(-1)) /* исключаем предупреждения компилятора */
10 #endif
11 #ifndef SEMVMX
12 #define SEMVMX 32767 /* исторически сложившееся максимальное значение для семафора System V */
13 #endif
Тип данных sem_t
1-5 Мы реализуем именованный семафор Posix с помощью набора семафоров System V, состоящего из одного элемента. Структура данных семафора содержит идентификатор семафора System V и магическое число (обсуждавшееся в связи с листингом 10.21).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Использование семафоров
Использование семафоров Классической областью применения семафоров является управление распределением конечных ресурсов, когда значение счетчика семафора ассоциируется с определенным количеством доступных ресурсов, например, количеством сообщений, находящихся в
Ограниченность семафоров
Ограниченность семафоров В Windows существуют важные ограничения, касающиеся реализации семафоров. Например, каким образом поток может потребовать, чтобы счетчик семафора уменьшился на 2? Для этого поток мог бы организовать ожидание два раза подряд, как показано ниже, но
Создание и инициализация семафоров
Создание и инициализация семафоров Реализация семафоров зависит от аппаратной платформы и определена в файле <asm/semaphore.h>. Структура struct semaphore представляет объекты типа семафор. Статическое определение семафоров выполняется следующим образом.static DECLARE_SEMAPHORE_GENERIC(name,
Использование семафоров
Использование семафоров Функция down_interruptible() выполняет попытку захватить данный семафор. Если эта попытка неудачна, то задание переводится в состояние ожидания с флагом TASK_INTERRUPTIBLE. Из материала главы 3 следует вспомнить, что такое состояние процесса означает, что задание
12.3.1 Определение семафоров
12.3.1 Определение семафоров Семафор представляет собой обрабатываемый ядром целочисленный объект, для которого определены следующие элементарные (неделимые) операции:• Инициализация семафора, в результате которой семафору присваивается неотрицательное значение;•
12.3.2 Реализация семафоров
12.3.2 Реализация семафоров Дийкстра [Dijkstra 65] показал, что семафоры можно реализовать без использования специальных машинных инструкций. На Рисунке 12.6 представлены реализующие семафоры функции, написанные на языке Си. Функция Pprim блокирует семафор по результатам проверки
26.6.1. Создание множества семафоров
26.6.1. Создание множества семафоров Для создания множества семафоров или подключения к уже существующему множеству используется системный вызов semget():int semget(key_t key, int nsems, int semflg);Первый аргумент — это ключ IPC, который, как обычно, создается системным вызовом ftok(). Он
5.8. Реализация с использованием отображения в память
5.8. Реализация с использованием отображения в память Теперь рассмотрим реализацию очередей сообщений Posix с использованием отображения в память, взаимных исключений и условных переменных Posix. ПРИМЕЧАНИЕ Взаимные исключения и условные переменные описаны в главе 7, а
8.4. Реализация с использованием взаимных исключений и условных переменных
8.4. Реализация с использованием взаимных исключений и условных переменных Для реализации блокировок чтения-записи достаточно использовать взаимные исключения и условные переменные. В этом разделе мы рассмотрим одну из возможных реализаций, в которой предпочтение
10.14. Реализация с использованием FIFO
10.14. Реализация с использованием FIFO Займемся реализацией именованных семафоров Posix с помощью каналов FIFO. Именованный семафор реализуется как канал FIFO с конкретным именем. Неотрицательное количество байтов в канале соответствует текущему значению семафора. Функция sem_post
11.7. Ограничения семафоров System V
11.7. Ограничения семафоров System V На семафоры System V накладываются определенные системные ограничения, так же, как и на очереди сообщений. Большинство этих ограничений были связаны с особенностями реализации System V (раздел 3.8). Они показаны в табл. 11.1. Первая колонка содержит
System.DateTime и System.TimeSpan
System.DateTime и System.TimeSpan В завершение нашего обзора базовых типов данных позволите обратить ваше внимание на то, что пространство имен System определяет несколько полезных типов данных, для которых в C# не предусмотрено ключевых слов. Это, в частности, типы DateTime и TimeSpan (задачу
Базовые классы System.MulticastDelegate и System.Delegate
Базовые классы System.MulticastDelegate и System.Delegate Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые
4.4.3. Взаимоблокировки исключающих семафоров
4.4.3. Взаимоблокировки исключающих семафоров Исключающие семафоры являются механизмом, позволяющим одному потоку блокировать выполнение другого потока. Это приводит к возникновению нового класса ошибок. называемых взаимоблокировками или тупиковыми ситуациями. Смысл
5.2.2. Инициализация семафоров
5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле
5.2.4. Отладка семафоров
5.2.4. Отладка семафоров С помощью команды ipcs -s можно получить информацию о существующих группах семафоров. Команда ipcrm sem позволяет удалить заданную группу, например:% ipcrm sem