BLK: Велика блокування ядра

Добрий про просимо до рудому пасинку ядра Велика блокування ядра (Big Kernel Lock, BKL) – це глобальна спін-блокування, яка була створена спеціально для того, щоб полегшити перехід від первісної реалізації SMP n операційній системі Linux до дрібноструктурні блокувань Блокування BKL має наступні цікаві властивості

• Під час утримання BKL можна переходити в стан очікування Блокування автоматично звільняється, коли завдання переходить в стан очікування, і знову захоплюється, коли завдання планується на виконання Звичайно, це не означає, щобезпечно переходити в стан очікування при утриманні BKL, просто цеможна робити і це не призведе до взаімоблокіровке

• Блокування BKL рекурсивно Один процес може захоплювати цю блокування кілька разів поспіль, і це не призведе до самоблокировки, як у випадку звичайних спін-блокувань

• Блокування BKL може використовуватися тільки в контексті процесу

• Блокування BKL – це від лукавого

Розглянуті властивості дали можливість спростити перехід від ядер серії 20 до серії 22 Коли в ядро ​​2-0 була введена підтримка SMP, тільки одне завдання могло виконуватися в режимі ядра в будь момент часу (звичайно, зараз ядро ​​распараллелен дуже добре-пройдений величезний шлях) Метою створення ядра серії 22 було забезпечення можливості паралельного виконання коду ядра на декількох процесорах Блокування BKL була введена для того, щоб спростити перехід до дрібноструктурні блокувань У ті часи вона надала велику допомогу, а сьогодні вона призводить до погіршення масштабіруемості5

Використовувати блокування BKL не рекомендується Насправді, новий код ніколи не повинен використовувати BKL Однак це блокування все ще досить інтенсивно використовується в деяких частинах ядра Тому важливо розуміти особливості великий блокування ядра і інтерфейсу до неї Блокування BKL поводиться, як звичайна спін-блокування, за винятком тих особливостей, які були розглянуті вище Функція lock_kerne l () дозволяє захопити блокування, а функція unlock_kerne l () – звільнити блокування Кожен потік виконання може рекурсивно захоплювати цю блокування, але після цього необхідно стільки ж разів викликати функцію unlock_kerne l () При останньому виклику функції звільнення блокування блокування буде звільнена Функція kernellocke d () повертає ненульове значення, якщо блокування в даний момент захоплена, в іншому випадку повертається нуль Ці інтерфейси визначені у файлі Розглянемо простий приклад використання цього блокування

lock_kernel()

/*

* Критичний розділ, який синхронізований з усіма користувачами

* Блокування BKL ..

* Зауважимо, що тут можна безпечно переходити в стан очікування

* І блокування буде прозорим чином звільнятися

* Після перепланування блокування буде прозорим чином знову

* Захоплюватися

* Це гарантує, що не виникне стану взаимоблокировки,

* Але все-таки краще не переходити в стан очікування,

* Якщо необхідно гарантувати захист даних

*/

unlock_kernel()

Коли це блокування захоплена, відбувається заборона преемптівності Для ядер, скомпільованих під однопроцесорних машину, код BKL насправді не виконує ніяких блокувань У табл 98 наведено повний список функцій роботи з BKL

5 Хоча, може бути, вона і не така страшна, якою її іноді намагаються представити, вага ж деяких е люди вважають її втіленням диявола в ядрі

Таблиця 98 Функції роботи з великою блокуванням ядра

Функція Опис

lock_kernel () Захопити блокування BKL

unlock_kernel () Звільнити блокування BKL

kernel_locked () Повернути ненульове значення, якщо блокування захоплена, і Нульві іншому випадку

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

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

*

*