uawikipc.ru

Програмні переривання

Хоча більшість переривань генерується на апаратному рівні, ядро Windows генерує програмні переривання для вирішення безлічі завдань, серед яких і перелічені нижче:

  • запуск диспетчеризації потоков-
  • обробка не критичних за часом прериваній-
  • обробка закінчення часу таймера-
  • асинхронне виконання процедури в контексті конкретного потоку-
  • підтримка асинхронних операцій введення-виведення.

Ці завдання розглядаються в наступних розділах.

Діспетчерізіруемие переривання або переривання відкладеного виклику процедури (DeferredProcedureCall, DPC). Коли виконання потоку більше не може продовжуватися, можливо, через те, що він був завершений або через те, що він добровільно увійшов в стан очікування, ядро безпосередньо викликає диспетчер для негайного перемикання контексту.

Але іноді ядро виявляє, що перепланування повинно статися, коли виконується код має глибоке багаторівневе вкладення. У такій ситуації ядро запитує диспетчеризацію, але відкладає її наступ, доки не завершить свою поточну роботу. Використання програмного DPC-переривання є зручним способом реалізації цієї затримки.

Ядро завжди піднімає IRQL процесора до рівня DPC / dispatch або вище, коли йому потрібно синхронізувати доступ до загальних структурам ядра. Тим самим блокуються додаткові програмні переривання і диспетчеризація потоків. Коли ядро виявляє необхідність диспетчеризації, вона запитує переривання рівня DPC / dispatch, але процесор затримує переривання, оскільки IRQL знаходиться на цьому чи на більш високому рівні.

Коли ядро завершує свою поточну роботу, процесор бачить, що воно збирається поставити IRQL нижче рівня DPC / dispatch, і перевіряє наявність будь-яких відкладених переривань диспетчеризації. Якщо такі переривання є, IRQL знижується до рівня DPC / dispatch, і відбувається обробка переривань диспетчеризації. Активізація диспетчера потоків за допомогою програмного переривання є способом, що дозволяє відкласти диспетчеризацію, поки для неї не складуться необхідні умови. Але Windows використовує програмні переривання для того, щоб відкласти і інші типи обробки.

Крім диспетчеризації потоків ядро обробляє на цьому рівні IRQL і відкладені виклики процедур (DPC). DPC є функцією, яка виконує ту системну задачу, яка менш критична по часу, ніж поточна задача.

Функції називаються відкладеними (deferred), тому що вони не вимагають негайного виконання.

Відео: Введення в архітектуру ЕОМ і елементи ОС



Відкладені виклики процедур дають операційній системі можливість генерувати переривання і виконувати системну функцію в режимі ядра.

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

DPC-виклик представлений DPC-об`єктом, який є об`єктом управління ядра, невидимим для програм для користувача режиму, але видимим для драйверів пристроїв і іншого системного коду. Найбільш важливою інформацією, що міститься в DPC-об`єкті, є адреса системної функції, яку ядро викличе при обробці DPC-переривання. DPC-процедури, які очікують виконання, зберігаються в чергах, керованих ядром, - по одній черзі на кожен процесор.

Вони називаються DPC-чергами. Для запиту DPC системний код викликає ядро для ініціалізації DPC-об`єкта, а потім поміщає цей об`єкт в DPC-чергу.

За замовчуванням ядро поміщає DPC-об`єкти в кінець DPC-черзі того процесора, при роботі якого була запрошена DPC-процедура (зазвичай того процесора, на якому виконується ISR-процедура). Але драйвер пристрою може скасувати таку поведінку, вказавши DPC-пріоритет (низький, середній, вище середнього або високий, де за замовчуванням використовується середній пріоритет) і націливши DPC на конкретний процесор. DPC-виклик, націлений на конкретний центральний процесор, відомий як цільової DPC. Якщо DPC має високий пріоритет, ядро ставить DPC-об`єкт в початок черги, в іншому випадку для всіх інших пріоритетів воно ставить об`єкт в кінець черги.

Ядро обробляє DPC-виклики, коли IRQL-рівень процесора готовий знизитися з IRQL-рівня DPC / dispatch або більш високого рівня до більш низького IRQL-рівня (APCілі passive). Windows забезпечує перебування IRQL на рівні DPC / dispatch і витягує DPC-об`єкти з черги поточного процесора до тих пір, поки вона не буде вичерпана (тобто ядро «витрачає» чергу), викликаючи по черзі кожну DPC-функцію. Ядро дасть можливість IRQL-рівню впасти нижче рівня DPC / dispatch і дозволити продовжити звичайне виконання потоку тільки коли черга виснажиться. Обробка DPC зображена на малюнку DPC-пріоритети можуть вплинути на поведінку системи і іншим чином.

Зазвичай ядро ініціює витрата DPC-черзі перериванням DPC / dispatch-рівня. Ядро генерує таке переривання тільки в тому випадку, коли DPC-виклик спрямований на поточний процесор (той, на якому виконується ISR-процедура) і DPC має пріоритет вище низького (low). Якщо DPC має низький пріоритет, ядро запитує переривання тільки в тому випадку, коли кількість невиконаних запитів DPC процесора перевищує порогове значення або якщо кількість DPC-викликів, виконання яких запитується на процесорі в даному вікні часу, невелика.

Доставка-DPC-виклику

Доставка DPC-виклику

Якщо DPC-виклик націлений на центральний процесор, що відрізняється від того, на якому запущена ISR-процедура, і пріоритет DPC високий (high) або вище середнього (medium-high), ядро негайно сигналізує цільовим центрального процесора (посилаючи йому диспетчерське IPI) про необхідність витрати його DPC-черзі, але тільки якщо цільової процесор знаходиться в режимі очікування. Якщо пріоритет середній або низький, то для видачі ядром переривання DPC / dispatch кількість DPC-викликів, які перебувають в черзі на цільовому процесорі, має перевищити певний поріг. Системний потік простою (idle) також спустошує DPC-чергу того процесора, на якому він запущений. Незважаючи на ту гнучкість, яку надають системі цільові призначення DPC-викликів і рівні пріоритету, драйверампристроїв рідко потрібно змінювати поведінку за замовчуванням своїх DPC-об`єктів. Ситуації, які ініціюють спустошення DPC-черзі, зведені в таблиці. Якщо подивитися на правила генерації, то, фактично, виходить, що пріоритети вище середнього і високий рівні один одному. Різниця проявляється при їх вставці в список, коли переривання високого рівня знаходяться попереду, а переривання рівня вище середнього ззаду.

Оскільки потоки користувальницького режиму виконуються при низькому IRQL, високі шанси на те, що DPC-виклик перерве виконання звичайного користувача потоку. DPC-процедури виконуються незалежно від того, який потік запущений, стало бути, коли запускається DPC-процедура, вона не може вибудувати припущення щодо того, чиє адресний простір, якого саме процесу в даний момент відображається. DPC-процедури можуть викликати функції ядра, але вони не можуть викликати системні служби, генерувати помилки відсутності сторінки або ж створювати або очікувати об`єкти диспетчеризації. Проте вони можуть звертатися до невивантажуваного адресами системної пам`яті, оскільки системне адресний простір відображено завжди, незалежно від того, що з себе представляє поточний процес.

Правила генерації DPC-переривання

пріоритет DPCDPC-виклик націлюється на процесор, що виконує
ISR-процедури
DPC-виклик націлюється
на інший процесор
Низький (Low)Довжина DPC-черзі перевищує максимальну довжину DPC-черзі або рівень DPC-запитів нижче мінімального
рівня DPC-запитів
Довжина DPC-черзі перевищує максимальну довжину DPC-черзі або система знаходиться в просте
середній
(Medium)
завждиДовжина DPC-черзі перевищує максимальну довжину DPC-черзі або система знаходиться в просте
Вище середнього
(Medium-High)
завждиЦільовий процесор простоює
Високий (High)завждиЦільовий процесор простоює

DPC-виклики надаються в першу чергу драйверампристроїв, але також використовуються і ядром. Найчастіше ядро використовує DPC для обробки закінчення кванта часу. При кожному такті системного годинника виникає переривання на IRQL-рівні clock. Оброблювач переривання від годинника (повинен стартувати на IRQL-рівні clock) оновлює системний час і потім зменшує показання лічильника, що відслідковує тривалість роботи поточного потоку.

Коли лічильник доходить до нуля, квант часу потоку закінчується, і ядру, можливо, потрібно буде перепланувати час процесора, тобто виконати завдання з більш низьким пріоритетом, яка повинна виконуватися на IRQL-рівні DPC / dispatch.

Оброблювач переривання від годинника ставить DPC-виклик в чергу, щоб ініціювати диспетчеризацію потоків, а потім завершити свою роботу і знизити IRQL-рівень процесора. Оскільки у DPC-переривання пріоритет нижче, ніж у переривань від пристроїв, будь-які відкладені переривання від пристроїв, що з`являються до завершення переривання від годинника, обробляються до видачі DPC-переривання.

Так як DPC-дзвінки здійснюються незалежно від того, який з потоків виконується в даний час на системі (що багато в чому схоже на переривання), вони є основною причиною того, що система, на якій вони виконуються, стає несприйнятливою до робочого навантаження клієнтських систем або робочої станції, тому що навіть потоки з найвищим рівнем пріоритету будуть перервані очікують DPC-викликом.

Деякі DPC-дзвінки здійснюються настільки довго, що користувачі можуть помітити відставання відео або звуку або навіть відчути ненормальне уповільнення реакції миші або клавіатури, тому для драйверів з тривалими DPC-викликами Windows підтримує потокові DPC-виклики.

Відео: Переривання по таймеру в Arduino стилі

Потокові DPC-виклики, як випливає з їх назви, призначені для виконання DPC-процедури на пасивному (passive) рівні в потоці з пріоритетом реального часу (priority 31). Це дозволяє DPC-викликом скористатися пріоритетом над більшістю потоків користувальницького режиму (оскільки більшість потоків додатків не починається в діапазонах пріоритетів реального часу). Але це дозволяє іншим перериванням, непотоковим DPC-викликам, APC-викликів і потокам з більш високим пріоритетом реалізувати свій пріоритет перед цією процедурою.

Поділитися в соц мережах:
Схожі
» » Програмні переривання