stringtranslate.com

Seqlock

Seqlock (сокращение от sequence lock ) это специальный механизм блокировки , используемый в Linux для поддержки быстрой записи общих переменных между двумя параллельными подпрограммами операционной системы . Семантика стабилизировалась с версии 2.5.59, и они присутствуют в стабильной серии ядер 2.6.x. Seqlocks были разработаны Стивеном Хеммингером и изначально назывались frlocks, на основе более ранней работы Андреа Арканджели. Первая реализация была в коде времени x86-64, где требовалась синхронизация с пользовательским пространством, где было невозможно использовать настоящую блокировку.

Это согласованный механизм чтения-записи , который позволяет избежать проблемы истощения записи . Seqlock состоит из хранилища для сохранения порядкового номера в дополнение к блокировке. Блокировка предназначена для поддержки синхронизации между двумя записями, а счетчик — для указания согласованности в чтениях. Помимо обновления общих данных, запись увеличивает порядковый номер как после получения блокировки, так и перед снятием блокировки. Читатели считывают порядковый номер до и после чтения общих данных. Если порядковый номер нечетный в любом случае, запись взяла блокировку во время чтения данных, и она могла измениться. Если порядковые номера различаются, запись изменила данные во время чтения. В любом случае читатели просто повторяют попытку (используя цикл), пока не прочитают тот же четный порядковый номер до и после.

Читатель никогда не блокируется, но ему может потребоваться повторить попытку, если запись находится в процессе; это ускоряет читателей в случае, когда данные не были изменены, поскольку им не нужно получать блокировку, как это было бы с традиционной блокировкой чтения-записи. Кроме того, писатели не ждут читателей, тогда как с традиционными блокировками чтения-записи они это делают, что приводит к потенциальному нехватке ресурсов в ситуации, когда есть несколько читателей (потому что писатель должен ждать, пока не будет читателей). Из-за этих двух факторов последовательные блокировки более эффективны, чем традиционные блокировки чтения-записи , в ситуации, когда есть много читателей и мало писателей. Недостаток в том, что если слишком много активности записи или читатель слишком медленный, они могут заблокироваться (и читатели могут умереть).

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

Впервые это было применено к обновлению счетчика системного времени. Каждое прерывание времени обновляет время дня; может быть много считывателей времени для внутреннего использования операционной системы и приложений, но записи относительно редки и происходят только по одному за раз. Например, код счетчика времени BSD, по-видимому, использует похожую технику.

Одна из тонких проблем использования seqlocks для счетчика времени заключается в том, что невозможно пройти его с помощью отладчика. Логика повтора будет срабатывать все время, поскольку отладчик достаточно медленный, чтобы гонка чтения происходила всегда.

Смотрите также

Ссылки