Seqlock - Seqlock

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

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

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

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

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

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

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

Рекомендации