Секвентной блокування

(seq lock) – це новий тип блокування, який зявився в ядрах серії 26 Ці блокування надають дуже простий механізм читання і запису спільно використовуваних даних Робота таких блокувань заснована на лічильнику послідовності подій Перед записом даних даних захоплюється спін-блокування, і значення лічильника збільшується на одиницю Після запису даних значення лічильника знову збільшується на одиницю, і спінблокіровка звільняється, даючи можливість запису іншим потокам Перед читанням і після читання даних перевіряється значення лічильника Якщо два отриманих значення однакові, то під час читання даних новий акт записи не розпочинався, Якщо до того ж обидва ці значення парні, то до моменту початку читання акт запису був закінчений (при захопленні блокування на запис значення лічильника стає непарних, а перед звільненням – знову парних, так як початкове значення лічильника дорівнює нулю)

Визначення секвентной блокування можна записати наступним чином

seqlock_tmr_seq_lock = SEQLOCK_UNLOCKED

Ділянка коду, який здійснює запис, може виглядати наступним чином

write_seqlock(&ampmr_seq_lock)

/ * Блокування захоплена на запис .. * /

write_sequnlock(&ampmr_seq_lock)

Це виглядає, як робота з звичайної спін-блокуванням Незвичайність зявляється в коді читання, який дещо відрізняється від раніше розглянутих

unsigned long seq

do {

seq = read_seqbegin(&ampmr_seq_lock)

/ * Тут потрібно читати дані .. * /

} while (read_seqretry(&ampmr_seq_lock, seq))

корисні для забезпечення дуже швидкого доступу до даних у випадку, коли застосовується багато потоків читання і мало потоків запису Крім того, при використанні цього типу блокувань потоки записи отримують більш високий пріоритет перед потоками читання Блокування записи завжди буде успішно захоплена, якщо немає інших потоків запису Потоки читання ніяк не впливають на захоплення блокування записи, на противагу тому, що має місце для спін-блокувань і семафорів читання-запису Більш того, потоки, які очікують на запис, будуть викликати постійні повторення циклу читання (як у показаному прикладі) до тих пір, поки не залишиться жодного потоку, що утримує блокування запису під час читання даних

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*