Семафоры
В сущности, они реализуют примитив блокировки, позволяющий процессам находиться в состоянии ожидания, пока не освободится необходимый ресурс.
Linux включает в себя два вида семафоров:
- семафоры ядра, используемые управляющими трактами ядра;
- семафоры межпроцессного взаимодействия, используемые процессами режима пользователя.
Семафор ядра аналогичен спин-блокировке в том, что он не позволяет управляющему тракту ядра продолжать выполнение, если установлена блокировка. Однако когда тракт ядра пытается обратиться к занятому ресурсу, защищенному семафору ядра, соответствующий процесс приостанавливается. Процесс снова принимает состояние выполняемый” после освобождения ресурса. Таким образом, семафоры ядра могут быть получены только функциям, которым разрешено спать”, т. е. обработчики прерываний и функции отложенного выполнения не могут воспользоваться ими.
Семафор ядра является объектом типа struct semaphore, состоящим из следующих полей:
- count — хранит значение типа atomic t. Если оно больше 0, ресурс свободен, т. е. к нему можно тут же обратиться. Если поле count равно 0, значит, семафор закрыт, но никакой другой процесс не ждет защищенный ресурс. Наконец, если значение count отрицательно, значит, ресурс недоступен и как минимум один процесс ожидает его освобождения;
- wait — хранит адрес очереди ожидания, включающей все спящие процессы, ожидающие ресурс на данный момент. Естественно, если поле count больше или равно нулю, очередь пуста;
- sleepers — хранит флаг, показывающий, имеются ли процессы, спящие ”на семафоре”. Вскоре мы увидим этот флаг в действии.
Функции init_MUTEX И init_MUTEX_LOCKED МОГуТ быть ВЫЗВаНЫ ДЛЯ ИНИциализации семафора эксклюзивного доступа. Они устанавливают поле count, соответственно, в значение 1 (свободный ресурс с эксклюзивным доступом) и 0 (занятый ресурс, предоставленный в данный момент процессу, инициализирующему семафор). Макросы declare mutex и declare_mutex_ locked делают то же самое, но они, кроме прочего, статически выделяют переменную типа struct semaphore. Обратите внимание, что поле count семафора также может быть инициализировано произвольным положительным
числом п. В этом случае максимум п процессам разрешено одновременно обратиться к ресурсу.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница