Семафори читання-запису

Семафори, так само як і спін-блокування, можуть бути типу читання-запису Ситуації, в яких краще використовувати семафори читання-запису такі ж як і у випадку використання спін-блокувань читання-запису

представляються за допомогою структури struc t rw_ semaphore, яка визначена у файлі Статично певний семафор читання-запису може бути створений за допомогою функції

static DECLARE_RWSEM(name)

де name – це імя нового семафора

, які створюються динамічно, можуть бути ініціалізовані за допомогою наступної функції

init_rwsem(struct rw_semaphore *sem)

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

static DECLARE_RWSEM(mr_rwsem)

/ * Спроба захопити семафор для читання * /

down_read(&ampmr_rwsem)

/ * Критичний ділянку (тільки читання) . * /

/ * Звільняємо семафор * /

up_read(&amprar_rwsem)

/* .. */

/ * Спроба захопити семафор на запис * /

down_write(&ampmr_rwsem)

/ * Звільняємо семафор * /

/ * Критичний ділянку (читання і запис) .. * /

up write(&ampmr rwsem)

.

Для семафорів є реалізації функцій down_read_tryloc k () і down_write_

tryloc k () Кожна з них бере один параметр – покажчик на семафор читання-запису Обидві функції повертають ненульове значення, якщо блокування захоплена успішно, і нуль, якщо блокування знаходиться в стані конфлікту Слід бути уважними – поведінка цих функцій протилежно поведінки аналогічних функцій для звичайних семафорів, причому без будь-якої на те причини

мають унікальну функцію, аналога якій немає для спін-блокувань читання-запису Це функція downgradewrite r (), яка авто-

матічсскі перетворює блокування, захоплену на запис, в блокування, захоплену на читання

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

Джерело: Лав, Роберт Розробка ядра 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>

*

*