Засоби заборони преемптівності

Так як ядро ​​є витісняється, процес, що працює в режимі ядра, може припинити виконання в будь-який момент, щоб дозволити виконуватися більш високопріоритетні процесу Це означає, що нове завдання може почати виконуватися в тому ж критичному ділянці, в якому виконувалося витіснене завдання Для того щоб запобігти таку можливість, код, який відповідає за преемптівность ядра, використовує спін-блокування в якості маркерів, щоб відзначати ділянки непреемптівності. Якщо спін-блокування захоплена, то ядро ​​є невитесняющая Так як проблеми, повязані з паралелізмом, у разі SMP і преемптівного ядра однакові, то, якщо ядро ​​вже є безпечним для SMPобработкі, таке просте додаток дозволяє також зробити ядро ​​безпечним і при витіснення

Будемо сподіватися, що це дійсно так Насправді виникають деякі ситуації, в яких немає необхідності використовувати спін-блокування, але потрібно забороняти преемптівность ядра Найбільш часто ситуація такого роду виникає через даних, привязаних до певних процесорам (рег-processor data) Якщо використовуються дані, унікальні для кожного процесора, то може бути необовязковим захищати їх за допомогою спін-блокувань, тому що тільки один процесор може отримувати доступ до цих даних Якщо ніяка спін-блокування не захоплена і ядро ​​є преемптівним, то зявляється можливість доступу до тих же змінним для знову запланованого завдання, як показано в наступному прикладі

завдання А маніпулює змінної foo завдання А витісняється

завдання У планується на виконання

завдання У маніпулює змінної foo завдання У завершується

завдання А планується на виконання завдання А маніпулює змінної foo

Отже, навіть однопроцессорного компютера до деякої змінної може псевдопараллельно звертатися кілька процесів У звичайній ситуації для такої змінної потрібно спін-блокування (Для захисту при істинному паралелізм на багатопроцесорної машині) Якщо ця змінна повязана з одним процесором, то для неї не потрібно блокування

Для вирішення зазначеної проблеми преемптівность ядра можна заборонити за допомогою функції preempt_disabl e () Цей виклик може бути вкладеним, тобто функцію можна викликати багато разів поспіль Для кожного такого виклику потрібен відповідний виклик функції preerapt_enabl e () Останній виклик функції preemptenable () дозволяє преемптівность, як показано в наступному прикладі

preempt_disable()

/ * Преемптівность заборонена .. * /

preempt_enable()

Лічильник преемптівності поточного процесу містить значення, рівне кількості захоплених цим процесом блокувань плюс кількість викликів функції preempt_disable () Якщо значення цього лічильника дорівнює нулю, то ядро ​​є витісняється Якщо значення цього лічильника більше або дорівнює одиниці, то ядро ​​не витісняється Даний лічильник неймовірно корисний для налагодження атомарних операцій спільно з переходами в стан очікування Функція preempt_count () повертає значення даного лічильника У табл 99 показаний повний список функцій управління преемптівностио

Табліца99 Функції управління преемптівностио ядра

Функція Опис

preempt_disable () Заборонити витіснення коду ядра preempt_enable () Дозволити витіснення коду ядра preempt_enable_no_resched () Дозволити витіснення коду ядра,

але не перепланувати виконання процесу preempt_count () Повернути значення лічильника преемптівності

Більш повне рішення задачі роботи з даними, повязаними з певним процесором, – це отримання номера процесора (який використовується в якості індексу для доступу до даних, повязаних з певним процесором) за допомогою функції get_cpu () Ця функція забороняє преемптівность ядра перед тим, як повернути номер поточного процесора

int cpu = get_cpu()

/ * Працюємо з даними, повязаними з поточним процесором .. * /

/ * Робота закінчена, знову дозволяємо витіснення коду ядра * /

put_cpu()

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

*

*