• Замечательная Италия туры от 10 000 рублей

    Замечательная Италия туры от 10 000 рублей

    www.fjord.travel

  • Спецодежда в москве

    Сигнальные жилеты Габарит - спецодежда в москве.

    tk-tsz.ru





Linux Kernel (Ядро линукса) (часть 1)


Семафоры

В сущности, они реализуют примитив блокировки, позволяющий процессам находиться в состоянии ожидания, пока не освободится необходимый ресурс.

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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

Linux Kernel (Ядро линукса) (часть 1)

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть другие прерывания того же типа, и другие процессоры могут приступить к их обработке. Без спин-блокировки к главному дескриптору прерывания могли бы обратиться сразу несколько процессоров. Как мы...

Linux Kernel (Ядро линукса) (часть 2)

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

Linux Kernel (Ядро линукса) (часть 3)

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...