Книга: Разработка ядра Linux
Секвентные блокировки
Секвентные блокировки
Секвентная блокировка (seq lock) — это новый тип блокировки, который появился в ядрах серии 2.6. Эти блокировки предоставляют очень простой механизм чтения и записи совместно используемых данных. Работа таких блокировок основана на счетчике последовательности событий. Перед записью рассматриваемых данных захватывается спин-блокировка, и значение счетчика увеличивается на единицу. После записи данных значение счетчика снова увеличивается на единицу, и спин-блокировка освобождается, давая возможность записи другим потокам. Перед чтением и после чтения данных проверяется значение счетчика. Если два полученных значения одинаковы, то во время чтения данных новый акт записи не начинался, Если к тому же оба эти значения четные, то к моменту начала чтения акт записи был закончен (при захвате блокировки на запись значение счетчика становится нечетным, а перед освобождением — снова четным, так как изначальное значение счетчика равно нулю).
Определение секвентной блокировки можно записать следующим образом.
seqlock_t mr_seq_lock = SEQLOCK_UNLOCKED;
Участок кода, который осуществляет запись, может выглядеть следующим образом.
write_seqlock(&mr_seq_lock);
/* блокировка захвачена на запись ... */
write_sequnlock(&mr_seq_lock);
Это выглядит, как работа с обычной спин-блокировкой. Необычность появляется в коде чтения, который несколько отличается от ранее рассмотренных.
unsigned long seq;
do {
seq = read_seqbegin(&mr_seq_lock);
/* здесь нужно читать данные ... */
} while (read_seqretry(&mr_seq_lock, seq));
Секвентные блокировки полезны для обеспечения очень быстрого доступа к данным в случае, когда применяется много потоков чтения и мало потоков записи. Кроме того, при использовании этого типа блокировок потоки записи получают более высокий приоритет перед потоками чтения. Блокировка записи всегда будет успешно захвачена, если нет других потоков записи. Потоки чтения никак не влияют на захват блокировки записи, в противоположность тому, что имеет место для спин-блокировок и семафоров чтения-записи. Более того, потоки, которые ожидают на запись, будут вызывать постоянные повторения цикла чтения (как в показанном примере) до тех пор, пока не останется ни одного потока, удерживающего блокировку записи во время чтения данных.
- Атомарные операции
- Спин-блокировки
- Спин-блокировки чтения-записи
- Семафоры
- Семафоры чтения-записи
- Сравнение спин-блокировок и семафоров
- Условные переменные
- BKL: Большая блокировка ядра
- Секвентные блокировки
- Средства запрещения преемптивности
- Барьеры и порядок выполнения
- Резюмирование по синхронизации
- ГЛАВА 8 Блокировки чтения-записи
- 14.2.1. Концепции блокировки файлов
- 14.2.2.1. Описание блокировки
- Блокировки чтения
- Блокировки между обработчиками нижних половин
- Блокировки
- Взаимоблокировки
- Конфликт при захвате блокировки и масштабируемость
- Блокировки в вашем коде
- Спин-блокировки
- Спин-блокировки и обработчики нижних половин
- Спин-блокировки чтения-записи