Может ли одно и то же прерывание по таймеру происходить параллельно? - PullRequest
0 голосов
/ 05 марта 2020

Я реализовал один обработчик прерывания таймера в модуле ядра.

Для этого обработчику прерывания таймера требуется около 1000 мкс.

И я хочу, чтобы этот таймер срабатывал каждые 10 мкс.

(Я надеюсь, что при этом один и тот же обработчик будет выполняться параллельно.)

(я знаю, что это может создать колоссальные издержки на прерывания, но я хочу реализовать его для некоторого тестирования.)

Но этот обработчик, похоже, не работает параллельно.

Кажется, что прерывание таймера ожидает завершения обработчика.

Может ли то же самое прерывание таймера происходить параллельно ?

Если нет, существует ли механизм ядра, который может параллельно запускать один и тот же обработчик?

1 Ответ

0 голосов
/ 06 марта 2020

Если таймер срабатывает каждые 10 мкс и требует 1000 мкс (1 мс) для завершения, вам потребуется 100 выделенных процессоров, чтобы едва успевать за таймерами. Короткий ответ - нет, система прерываний не собирается это поддерживать. Если прерывание рекурсивно , оно неизбежно потребляет стек обработчика прерываний.

Прерывания обычно работают, когда короткий бит кода вызывается напрямую, когда оно прерывается. Если нужно проделать больше работы, этот короткий бит запланировал бы более медленный бит и запретил бы этот источник прерывания. Это должно минимизировать задержку, вызванную разрозненными устройствами, требующими внимания процессора. Более медленный бит, когда он определяет, что он удовлетворил запрос устройства, может повторно разрешить прерывания из этого источника.

[В linux короткий бит называется верхней половиной; чем медленнее бит в нижней половине. Это немного сбивает с толку, потому что десятилетия реализации ядра до linux называли его как раз наоборот. Лучше всего избегать этих условий. ]

Один из многих способов получить желаемый эффект - заставить этот медленный обработчик освободить семафор, а затем снова включить прерывание. После этого вы могли бы иметь соответствующее количество потоков в oop, получая семафор и затем выполняя вашу задачу.

...