Переключение задач при обработке прерывания

Вопросы программного кода и архитектуры Linux

Модератор: Olej

strap89
Писатель
Сообщения: 24
Зарегистрирован: 23 июл 2020, 11:16
Контактная информация:

Переключение задач при обработке прерывания

Непрочитанное сообщение strap89 » 20 фев 2021, 20:53

Здравствуйте!
Вопрос по работе планировщика задач linux (наверно).
При возникновении аппаратного прерывания, код передается верхней половине обработчика. При этом остальные прерывания запрещены.
Предполагается, что обработчик быстро сделает обработку своей задачи и возвратит управление системе.
Собственно вопрос: если обработчик задержится с выполнением, планировщик может переключить задачу и отдать ее другому процессу?
И по какому принципу это произойдет? Ведь обработчик прерывания не связан с вызывающим процессом и соответственно не имеет приоритета при переключении задачи.
Я возможно поднимаю тему, давно обсужденную, очень извиняюсь за это (слишком мало и плохо знаю систему). Я ориентировался на книгу Р.Лава про ядро и текстом из книги Цилюрика Модули ядра Linux. В обоих книгах обсуждается планировщик задач и подробно описывается алгоритм его работы, а по поводу обработки аппаратных прерываний упоминается только, что прерывания запрещены, многие функции недоступны и необходимо завершить обработчик как можно скорее. Про работу планировщика внутри прерывания ничего нет (вернее, скорее всего я это пропустил). Помогите разобраться с собственной дремучестью.
Заранее благодарен.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Переключение задач при обработке прирывания

Непрочитанное сообщение Olej » 21 фев 2021, 23:32

strap89 писал(а):
20 фев 2021, 20:53
При возникновении аппаратного прерывания, код передается верхней половине обработчика. При этом остальные прерывания запрещены.
Предполагается, что обработчик быстро сделает обработку своей задачи и возвратит управление системе.
Собственно вопрос: если обработчик задержится с выполнением, планировщик может переключить задачу и отдать ее другому процессу?
И по какому принципу это произойдет? Ведь обработчик прерывания не связан с вызывающим процессом и соответственно не имеет приоритета при переключении задачи.
Если я правильно понял вопрос:
- "переключить задачу и отдать ее другому процессу" - сам термин процесс относится к user space, пространству пользователя - выполнение аппаратно переключается в непривилегированный режим, аппаратное кольцо защиты 3 для процессоров архитектуры x86...
- прерывание происходит с переходом в режим ядра, kernel space, привилегированный режим аппаратное кольцо защиты 3 для процессоров архитектуры x86...
- планировщик (в Linux это O(n) планировщик - это не совсем вытесняющий планировщик) планирует и переключает только и исключительно процессы юзер спейс (а если говорить совсем точно - переключает контекст потоков, thread, внутри этих потоков)...
- планировщик никак не может вмешаться и прервать выполнение кода в режиме ядра - обработчики прерываний, и нижняя и верхняя половина, и любой другой код ядра (в Linux появились потоки в ядре, в отличие от многих других, предыдущих операционных систем);
- разница (верхнего и нижнего обработчиков прерываний) в том, что обработчик верхней половины (вызываемый 1-м и короткий) запрещает прерывания, и на время его выполнения замаскированы более приоритетные прерывания, которые могут возникнуть во время его выполнения...
- обработчик нижней половины, которому затем передаётся управление, продолжает обработку уже при разрешённых прерываниях ... если до него (во время работы верхней половины) уже было отложенное прерывание более высокого приоритета, то обработчик нижней половины так и не начнёт выполняться сразу после разрешения прерываний...

В итоге: ни один пользовательский процесс (user space) не может прервать кода ядра, в том числе и обработчики прерывания (хотя в ядре есть много автономного кода, в потоках, и кроме обработчиков прерываний). Планирование процессов пользователя происходит только на то время, которое остаётся после работы кода ядра.


strap89
Писатель
Сообщения: 24
Зарегистрирован: 23 июл 2020, 11:16
Контактная информация:

Re: Переключение задач при обработке прирывания

Непрочитанное сообщение strap89 » 22 фев 2021, 08:20

Хотя я, к своему стыду, был уверен, что linux реализует именно вытесняющую многозадачность. Нехорошо быть таким темным.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Переключение задач при обработке прирывания

Непрочитанное сообщение Olej » 22 фев 2021, 13:07

strap89 писал(а):
22 фев 2021, 08:20
linux реализует именно вытесняющую многозадачность.
И вы тут в какой-то мере правы ;-)
В Linux они используют "хитрую вытесняющую многозадачность", которая имеет сложность O(n) и чем они очень гордятся (это где-то начиная с ядра 2.5, кажется):
- все процессы (потоки по-моему?) в системе в начале очередного цикла планирования (весьма короткого) ранжируются по планируемому им кванту времени выполнения (кому больше - кому меньше ... на основе так называемого nice, "уступчивости" - величине противоположной приоритету)...
- потом они запускаются на очередной цикл планирования, когда каждый выберет свой квант (если не откажется от активности по своей инициативе)
... и так по кругу...
В каком-то смысле это - вытеснение, но вытеснение какое-то :-o ... не индивидуальное, а групповое. ;-)
Об этом есть у Лава ... и ещё где-то в литературе, достаточно много.

Но есть исключение: потоки с диспетчированием реального времени, RR или FIFO (никак не путать - это не связано с реальным временем в системе).
Вы можете посмотреть их командой ps (с ключами о потоках), или в команде top - колонки PR и NI (2-я и 3-я).
Как правило, это по дефаулту некоторые потоки ядра Linux.
Вот эти (Round Robin First Input или First Output) потоки диспетчируются действительно истинно вытесняющими алгоритмами ... и на основе приоритетов (PR) в отличие от nice (NI) для обычных пользовательских процессов.

Вы можете свои процессы и потоки запускать с приоритетами и диспетчированием реального времени, см.: редкие полезные команды (естественно, такие чудеса допустимы только с root ;-) ).
Только вы должны хорошо понимать и взвесить когда и зачем это делаете - можно сильно навредить системе.
Но иногда это может быть именно то, чего вы хотите добиться - ускорить реакцию программы на события.

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей