Книга: Разработка ядра Linux
Использование семафоров
Использование семафоров
Функция down_interruptible()
выполняет попытку захватить данный семафор. Если эта попытка неудачна, то задание переводится в состояние ожидания с флагом TASK_INTERRUPTIBLE
. Из материала главы 3 следует вспомнить, что такое состояние процесса означает, что задание может быть возвращено к выполнению с помощью сигнала и что такая возможность обычно очень ценная. Если сигнал приходит в тот момент, когда задание ожидает на освобождение семафора, то задание возвращается к выполнению, а функция down_interruptible()
возвращает значение -EINTR
. Альтернативой рассмотренной функции выступает функция down()
, которая переводит задание в состояние ожидания с флагом TASK_UNINTERRUPTIBLE
. В большинстве случаев это нежелательно, так как процесс, который ожидает на освобождение семафора, не будет отвечать на сигналы. Поэтому функция down_interruptible()
используется значительно более широко, чем функция down()
. Да, имена этих функций, конечно, далеки от идеала.
Функция down_trylock()
используется для неблокирующего захвата указанного семафора. Если семафор уже захвачен, то функция немедленно возвращает ненулевое значение. В случае успеха по захвату блокировки возвращается нулевое значение и захватывается блокировка.
Для освобождения захваченного семафора необходимо вызвать функцию up()
. Рассмотрим следующий пример.
/* объявление и описание семафора с именем mr_sem и
первоначальным значением счетчика, равным 1 */
static DECLARE_MUTEX(mr_sem);
...
if (down_interruptible(&mr_sem))
/* получен сигнал и семафор не захвачен */
/* критический участок ... */
/* освободить семафор */
up(&mr_sem);
Полный список функций работы с семафорами приведен в табл. 9.5.
Таблица 9.5. Список функций работы с семафорами
Функция | Описание |
---|---|
sema_init(struct semaphore*, int) |
Инициализация динамически созданного семафора и установка для него указанного значения счетчика использования |
init_MUTEX(struct semaphore*) |
Инициализация динамически созданного семафора и установка его счетчика использования в значение 1 |
init_MUTEX_LOCKED (struct semaphore*) |
Инициализация динамически созданного семафора и установка его счетчика использования в значение 0 (т.е. семафор изначально заблокирован) |
down_interruptible(struct semaphore *) |
Выполнить попытку захватить семафор и перейти в прерываемое состояние ожидания, если семафор находится в состоянии конфликта при захвате (contended) |
down(struct semaphore*) |
Выполнить попытку захватить семафор и перейти в непрерываемое состояние ожидания, если семафор находится в состоянии конфликта при захвате (contended) |
down_trylock(struct semaphore*) |
Выполнить попытку захватить семафор и немедленно возвратить ненулевое значение, если семафор находится в состоянии конфликта при захвате (contended) |
up(struct semaphore*) |
Освободить указанный семафор и возвратить к выполнению ожидающее задание, если такое есть |
- 10.16. Реализация с использованием семафоров System V
- 5.2.4. Отладка семафоров
- Сравнение спин-блокировок и семафоров
- Ограниченность семафоров
- 5.2.2. Инициализация семафоров
- 12.3.2 Реализация семафоров
- 10.12. Использование семафоров несколькими процессами
- Сравнение различных систем межпроцессного взаимодействия