Умовні змінні

(conditional variable, completion variable) – простий засіб синхронізації між двома завданнями, які працюють в режимі ядра, коли необхідно, щоб одне завдання послало сигнал іншому про те, що відбулося деяке подія При цьому одне завдання очікує на умовної змінної, поки інше завдання не виконає деяку роботу Коли інше завдання завершить виконання своєї роботи, воно використовує умовну змінну для того, щоб повернути до виконання всі очікують на ній завдання Якщо це здається схожим на роботу семафора, то саме так воно і є, ідея та ж Насправді, умовні змінні просто забезпечують просте рішення проблеми, для якої в інших ситуаціях використовуються семафори Наприклад, в системному виклику vfork () умовна змінна використовується для повернення до виконання батьківського процесу при завершенні породженого

представляються за допомогою структури struc t completion, яка визначена у файлі

Статично умовна змінна може бути створена за допомогою макросу

DECLARE_COMPLETI0N(mr_comp)

Динамічно створена умовна змінна може бути инициализирована за допомогою функції init_completio n ()

Завдання, яке повинно очікувати на умовній змінної, викликає функцію wait_for_completio n () Після того як настало очікувана подія, виклик функції complete () посилає сигнал завданням, яке очікує на умовній змінної, і це завдання повертається до виконання У табл 97 наведено методи роботи з умовними змінними

Таблиця 97 Методи роботи з умовними змінними

Метод Опис

init_completion(struct completion *)

wait_for_completion(struct completion *)

complete(structcompletion*)

Ініціалізація динамічно створеної умовної змінної в заданій області памяті

Очікування сигналу на вказаній умовної змінної

Відправка сигналу всім очікують завданням та повернення їх до виконання

Для прикладів використання умовних змінних дивіться файли kernel / sched с і kernel / forkс Найбільш часто використовуються умовні змінні, які створюються динамічно, як частина структур даних Код ядра, який чекає па ініціалізацію структури даних, викликає функцію wait_for _ completion () Коли ініціалізація закінчена, які очікують завдання повертаються до виконання за допомогою виклику функції complete()

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

*

*