ФункцияОписание
read_lockЗахватить указанную блокировку на чтение
read_lock_irqЗапретить прерывания на локальном процессоре и захватить указанную блокировку на чтение
read_lock_irqsaveСохранить состояние системы прерываний на текущем процессоре, запретить прерывания на локальном процессоре и захватить указанную блокировку на чтение
read_unlockОсвободить указанную блокировку, захваченную для чтения
read_unlock_irqОсвободить указанную блокировку, захваченную для чтения, и разрешить прерывания на локальном процессоре
read_unlock_irqrestoreОсвободить указанную блокировку, захваченную для чтения, и восстановить состояние системы прерываний в указанное значение
write_lockЗахватить заданную блокировку на запись
write_lock_irqЗапретить прерывания на локальном процессоре и захватить указанную блокировку на запись
write_lock_irqsaveСохранить состояние системы прерываний на текущем процессоре, запретить прерывания на локальном процессоре и захватить указанную блокировку на запись
write_unlockОсвободить указанную блокировку, захваченную для записи
write_unlock_irqОсвободить указанную блокировку, захваченную для записи, и разрешить прерывания на локальном процессоре
write_unlock_irqrestoreОсвободить указанную блокировку, захваченную для записи, и восстановить состояние системы прерываний в указанное значение
write_trylockВыполнить попытку захватить заданную блокировку на запись и в случае неудачи возвратить ненулевое значение
rw_lock_initИнициализировать объект типа rwlock_t в заданной области памяти
rw_is_lockedВозвратить ненулевое значение, если указанная блокировка захвачена, иначе возвратить нуль

Еще один факт, который необходимо принимать во внимание при работе с блокировками чтения-записи в операционной системе Linux, — это то, что блокировка на чтение всегда имеет большее преимущество по сравнению с блокировкой на запись. Если блокировка захвачена на чтение и поток записи ожидает на ее освобождение, то все потоки, которые будут пытаться захватить блокировку на чтение, будут добиваться успеха. Поток записи, который периодически проверяет на освобождение блокировки, не сможет захватить блокировку, пока все потоки чтения эту блокировку не освободят. Поэтому большое количество потоков чтения будет приводить к "подвисанию" ожидающих потоков записи. Это важное обстоятельство всегда нужно помнить при разработке схемы блокировок.

Спин-блокировки обеспечивают очень быстрые и простые блокировки. Выполнение постоянных проверок в цикле является оптимальным, когда блокировки захватываются на очень короткое время и код не может переходить в состояние ожидания (например, в обработчиках прерываний). Если же период времени ожидания на освобождение блокировки может быть большим или имеется потенциальная возможность перехода в состояние ожидания при захваченной блокировке, то задача может быть решена с помощью семафоров.

<p>Семафоры</p>

В операционной системе Linux семафоры (semaphore) — это блокировки, которые переводят процессы в состояние ожидания. Когда задание пытается захватить семафор, который уже удерживается, семафор помещает это задание в очередь ожидания (wait queue) и переводит это задание в состояние ожидания (sleep). Когда процессы[49], которые удерживают семафор, освобождают блокировку, одно из заданий очереди ожидания возвращается к выполнению и может захватить семафор.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже