Роберт лав - розробка ядра linux - стор 58

Використання семафорів

Функція down_interruptible () виконує спробу захопити даний семафор. Якщо ця спроба невдала, то завдання переводиться в стан очікування з прапором TASK_INTERRUPTIBLE. З матеріалу глави 3 слід згадати, що такий стан процесу означає, що завдання може бути повернуто до виконання за допомогою сигналу і що така можливість звичайно дуже цінна. Якщо сигнал приходить в той момент, коли завдання очікує на звільнення семафора, то завдання повертається до виконання, а функція down_interruptible () повертає значення -EINTR. Альтернативою розглянутої функції виступає функція down (). яка переводить завдання в стан очікування з прапором TASK_UNINTERRUPTIBLE. У більшості випадків це небажано, так як процес, який чекає на звільнення семафора, не відповідатиме на сигнали. Тому функція down_interruptible () використовується значно ширше, ніж функція down (). Так, імена цих функцій, звичайно, далекі від ідеалу.

Функція down_trylock () використовується для неблокуючим захоплення зазначеного семафора. Якщо семафор уже захоплений, то функція негайно повертає нульове значення. У разі успіху по захопленню блокування повертається нульове значення і захоплюється блокування.

Для звільнення захопленого семафора необхідно викликати функцію up (). Розглянемо наступний приклад.

початковим значенням лічильника, рівним 1 * /

Необхідно переходити в стан очікування (steep) при захопленої блокування

Необхідно використовувати семафори

умовні змінні

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

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

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

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