Нижні половини

Завдання обробки нижніх половин – це виконати всю повязану з перериваннями роботу, яку не виконав обробник переривання В ідеальній ситуації – це майже вся робота, так як необхідно, щоб обробник переривання виконав по можливості меншу частину роботи (тобто виконався максимально швидко) і швидше повернув управління

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

Практично всі інші дії буде правильним виконати в обробнику нижньої половини Наприклад, якщо у верхній половині було вироблено копіювання даних з апаратного пристрою в память, то в обробнику нижньої половини, звичайно, має сенс ці дані обробити На жаль, не існує твердих правил, що дозволяють визначити, яку роботу де потрібно виконувати, – право вирішення залишається за автором драйвера Хоча жодне з рішень цього завдання не може бути неправшлним, рішення легко може виявитися неоптимальним Слід памятати, що обробники переривань виконуються асинхронно при забороненої, принаймні, поточної лінії запиту на переривання Мінімізація цієї затримки є важливою Хоча немає строгих правил з приводу того, як ділити роботу між обработчиками верхньої і нижньої половин, все ж можна навести кілька корисних порад

• Якщо робота критична до часу виконання, то її необхідно виконувати в обробнику прерипанія

• Якщо робота повязана з апаратним забезпеченням, то її слід виконати в обробнику переривання

• Якщо для виконання роботи необхідно гарантувати, що інше переривання (зазвичай з тим же номером) не перерве обробник, то роботу потрібно виконати в обробнику переривання

• Для всього іншого роботу варто виконувати в обробнику нижньої половини

При написанні власного драйвера пристрою є сенс подивитися на обробники переривань і відповідні їм обробники нижніх половин інших драйверів пристроїв – це може допомогти Беручи рішення про розділення роботи між обработчиками верхньої і нижньої половини, слід запитати себе: Що повинно бути в обробнику верхньої половини, а що може бути в обробнику нижньої половини . У загальному випадку, чим швидше виконується обробник переривання, тим краще

Коли потрібно використовувати нижні половини

Часто не просто зрозуміти, навіщо потрібно відкладати роботу і коли саме її потрібно відкладати Вам необхідно обмежити кількість роботи, яка виконується в обробнику переривання, тому що обробник переривання виконується при забороненої поточної лінії переривання Гірше того, обробники, зареєстровані із зазначенням прапора SA_INTERRUPT, виконуються привсіх заборонених лініях переривань на локальному процесорі (плюс поточна лінія переривання заборонена глобально) Мінімізувати час, протягом якого переривання заборонені, важливо для зменшення часу реакції і збільшення продуктивності системи Якщо до цього додати, що обробники переривань виконуються асинхронно по відношенню до іншого коду, і навіть по відношенню до інших обробникам переривань, то стає ясно, що потрібно мінімізувати час виконання обробника переривання Рішення – відкласти деяку частину роботи на більш пізній термін

Але що мається на увазі під пізнішим терміном Важливо зрозуміти, що пізніше означає не зараз Основний момент в обробці нижніх половин – це не відкласти роботу до певного моменту часу в майбутньому, а відкласти роботу до деякого невизначеного моменту часу в майбутньому, коли система буде не так завантажена і всі переривання знову будуть дозволені

Не тільки в операційній системі Linux, але і в інших операційних системах обробка апаратних переривань розділяється на дві частини Верхня половина виконується швидко, коли всі або деякі переривання заборонені Нижня половина (якщо вона реалізована) пиполняется пізніше, коли всі переривання дозволені Це рішення дозволяє підтримувати малий час реакції системи, завдяки тому що робота при заборонених перериваннях виконується протягом можливо малого періоду часу

Різноманіття нижніх половин

На відміну від обробників верхніх половин, які можуть бути реалізовані тільки в самих обробниках переривань, для реалізації обробників нижніх половин існує кілька механізмів Ці механізми являють собою різні інтерфейси і підсистеми, які дозволяють користувачеві реалізувати обробку нижніх половин У попередньому розділі ми розглянули єдиний існуючий механізм реалізації обробників переривань, а в цій главі розглянемо кілька методів реалізації обробників нижніх половин Насправді за історію операційної системи Linux існувало багато механізмів обробки нижніх половин Іноді збиває з пантелику те, що ці механізми мають дуже схожі або дуже невдалі назви Для того щоб придумувати назви механізмам обробки нижніх половин, необхідні Спеціальні програмісти.

У цьому розділі ми розглянемо принципи роботи та реалізацію механізмів обробки нижніх половин, які існують в ядрах операційної системи Linux серії 26 Також буде розглянуто, як використовувати ці механізми в коді ядра, який ви можете написати Старі і давно вилучені з ужитку механізми обробки нижніх половин являють собою історичну цінність, тому, де це важливо, про них також буде розказано

На самому початку свого існування операційна система Linux надавала єдиний механізм для обробки нижніх половин, який так і називався нижні половини (Bottom half) Ця назва було зрозуміло, тому що існувало тільки один засіб для виконання відкладеної обробки Відповідна інфраструктура називалася ВН і ми її так далі і будемо назвати, щоб уникнути плутанини з загальним терміном bottom half (нижня половина) Інтерфейс ВН був дуже простим, як і більшість речей у ті старі добрі часи Він надавав статичний список з 32 обробників нижніх половин Оброблювач верхньої половини повинен був зазначити який з обробників нижніх половин повинен виконуватися шляхом установки відповідного біта в 32-розрядному цілому числі Виконання кожного обробника ВН синхронізована глобальна, тобто ніякі два обробника не могли виконуватися одночасно, навіть на різних процесорах Такий механізм був простим у використанні, хоча і не гнучким простим у реалізації, хоча представляв собою вузьке місце в плані продуктивності

Пізніше розробники ядра запропонували механізм черг завдань (task queue) — одночасно як засіб виконання відкладеної обробки і як заміна для механізму ВН У ядрі визначалося сімейство черг Кожна чергу містила звязаний список функцій, які повинні були виконувати відповідні дії Функції, які стоять у черзі, виконувалися в певні моменти часу, в залежності від того, в якій черзі вони знаходилися Драйвери могли реєструвати власні обробники нижніх половин у відповідних чергах Цей механізм працював досить добре, але він був не настільки гнучким, щоб повністю замінити інтерфейс ВН Крім того, він був досить Великоваговим для забезпечення високої продуктивності критичних до цього систем, таких як мережева підсистема

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

лежання переривань1  (softirq) і механізм тасклетов (tasklet)

За винятком вирішення проблеми сумісності з існуючими драйверами, механізми відкладених переривань і тасклетов були в змозі повністю замінити інтерфейс ВН2

Відкладені переривання це набір з 32 статично визначених обробників нижніх половин, які можуть одночасно виконуватися на різних процесорах, навіть два обробника одного типу можуть виконуватися паралельно Тасклети – це гнучкі, динамічно створювані обробники нижніх половин, які є надбудовою над механізмом відкладених переривань і мають жахливу назву, що бентежить всех3

1 Термін softirq часто перекладається, як програмне переривання, проте, щоб не вносити плутанину з синхронним і програмним і перериванням і (винятковими ситуаціями) у цьому контексті використовується терми н відкладене переривання.(Прим ред)

2 Всвязи з глобальним синхронізмі м виконаних я обробника в ВН один з одним, не та до простий про був про їх конвертіроват ь для использовани я механізмів у відкладеннях х переривання й і тасклетов Однак в ядрах сери і 25 це нарешті вийшло зробити

3 Він і не мають нічого спільного з поняттям task (задача) Їх слід розуміти як прості е у використанні відкладені переривання я (softirq)

Два різних тасклета можуть виконуватися паралельно на різних процесорах, але при цьому два тасклета одного типу не можуть виконуватися одночасно Таким чином, тасклети – це хороший компроміс між продуктивністю і простотою використання У більшості випадків для обробки нижніх половин достатньо використання таскелетов Оброблювачі відкладених переривань є корисними, коли критична продуктивність, наприклад, для мережевої підсистеми Використання механізму відкладених переривань вимагає обережності, тому що два обробника одного і того ж відкладеного переривання можуть виконуватися одночасно На додаток до цього, відкладені переривання повинні бути зареєстровані статично на етапі компіляції Тасклети, навпаки, можуть бути зареєстровані динамічно

Ще більше заплутує ситуацію те, що деякі люди говорять про всіх обробниках нижніх половин як про програмні переривання, або відкладених переривань (software interrupt, або softirq) Іншими словами, вони називають механізм відкладених переривань і в загальному обробку нижніх половин програмними перериваннями На таких людей краще не звертати уваги, вони з тієї ж категорії, що і ті, які придумали назву ВН і тасклет

Під час розробки ядер серії 25 механізм ВН був врешті-решт викинутий, тому що всі користувачі цього механізму конвертували свій код для використання інших інтерфейсів обробки нижніх половин На додаток до цього, інтерфейс черг завдань був замінений на новий інтерфейс черг відкладених дій (work queue) Черги відкладених дій-це простий і в той же час корисний механізм, дозволяє поставити деяку дію в чергу для виконання в контексті процесу в пізніший момент часу

Отже, сьогодні ядро ​​серії 26 надає три механізму обробки нижніх половин в ядрі: відкладені переривання, тасклети і черги відкладених дій У ядрі також використовувалися інтерфейси ВН і черг завдань, але сьогодні від них залишилася тільки світла память

Таймери ядра

Ще один механізм виконання відкладеної роботи – це таймери ядра На відміну від механізмів, розглянутих у цій главі, таймери дозволяють відстрочити роботу на вказаний інтервал часу Інструменти, описані в цьому розділі, можуть бути корисні для відкладання роботи з поточного моменту до якогось моменту часу в майбутньому Таймери використовуються для відкладання роботи до того моменту, поки не пройде вказаний період часу

Тому таймери мають інше призначення, ніж механізми, описані в даному розділі Більш повне обговорення таймерів ядра буде приведено у главі 10, Таймери та управління часом.

Плутанина з нижніми половинами

Деяка плутанина з обработчиками нижніх половин має місце, але насправді – це тільки проблема назв Давайте знову повернемося до цього питання

Термін нижня половина (Bottom half) – це загальний термін, який стосується операційних систем і повязаний з тим, що деяка частина процесу обробки переривання відкладається на майбутнє В операційній системі Linux зараз цей термін означає те ж саме Всі механізми ядра, які призначені для відкладеної обробки, є обработчиками нижніх половин

Деякі люди також називають обробники нижніх половин програмними перериваннями йди soflirq, але вони просто намагаються дошкулити іншим

Термін Bottom Half також відповідає назві самого першого механізму виконання відкладених дій п операційній системі Linux Цей механізм ще називається ВН, тому далі так будемо називати саме цей механізм, а термін нижня половина (Bottom half) стосуватиметься загальної назви Механізм ВН був деякий час тому вимкнений з ужитку і повністю вилучений в ядрах серії 25

Зараз є три методи для призначення відкладених операцій: механізм відкладених переривань (softirq), механізм тасклетов і механізм черг відкладених дій Тасклети побудовані на основі механізму softirq, а черги відкладених дій мають повністю відмінну реалізацію У табл 71 показана історія обробників нижніх половин

Таблиця 71 Стан обробників нижніх половин

Механізм обробників Стан

ВН Вилучено в серії 25

Черги завдань Вилучено в серії 25

Відкладені переривання Доступно починаючи з серії 23

Тасклети Доступно починаючи з серії 23

Черги відкладених дій Доступно починаючи з серії 23

Давайте продовжимо розгляд кожного з механізмів окремо, користуючись цією стійкою плутаниною в назвах

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

*

*