Принцип обучения: Не существует такого понятия, как глупый вопрос. Основная идея заключается в том, что люди учатся, спрашивая. Меня спросили: «Можете ли вы показать и объяснить на уровне программирования, что плохо произойдет, если каждая задача может выполнять все инструкции».Использование прерывания Inter Processor
Я сделал дать код
main(){
_asm_("cli;");
while(1);
}
и объяснил (систему замороженной хорошо- UP)
Тогда я спросил: «Можно ли привести пример так, чтобы система не замерзают даже эти прерывания очистки сделаны? "
Я сделал изменить предыдущий пример:
Я сделал дать код
main(){
_asm_("cli;");
i=i/0;
while(1);
}
и объяснена его.
Тривиально: Если у нас есть спрос подкачка I =/0 причины первой ошибка страницы (страница данных нет) и другие задачи могут быть запланированы для запуска прерываний во время чтения диска и позже на деление на ноль отбросит эту задачу навсегда.
Но ответы были основаны на UP. Что относительно SMP? Я должен сказать, что ответы неполны. Он по-прежнему достаточно легко построить:
int i;
main(){
for(i=0;i<100;i++)// Suppose we have less than 100 CPUs
if(fork())
{ sleep(5);//The generating task has (most probable) time to do all forks
_asm_("cli;");
while(1);
}
}
, который отключает прерывания для всех процессоров, потому что каждый процессор получает ядовитую задачу для запуска.
Даже до сих пор глупый вопрос выявил много хорошего, чтобы научиться новичкам: привилегированные инструкции, пейджинг, обработка ошибок, планирование во время DMA, fork ..... Но небольшое сомнение остается (позор мне) о первой программе, запущенной на SMP.
Будет ли один из CPU отсутствовать навсегда или нет? Другие процессоры продолжаются и могут отправлять re_schedule() IPI-сообщение. Что происходит? Легко предположить, что замороженный CPU не проснулся, потому что прерывания отключены. Но, чтобы быть абсолютно уверенным, нужно знать больше.
Вопрос был: Является ли прерывание между процессорами (IPI) масляным или немасштабируемым? Я имею в виду самые распространенные «популярные» реализации?
Извините, мой глупый вопрос. Невозможно найти ответ. Я буду искать его. Я имею в виду номер штыря прерывания (сообщение maskable, I guess).
Мой собственный ответ - правильный? Я изучил этот вопрос, потому что ему больше никто не понравился, придя к следующим мыслям:
С важными приложениями в режиме реального времени мы долгое время наблюдали сторожевой таймер (HW прерывая процессор, чтобы как-то ответить «Я жив»,). Например, у нас есть главный компьютер управления и резервный компьютер, заботящийся о системе, если главный компьютер выключен.
Что относительно Linux? Какой вид сторожевого у нас есть? Мы можем скомпилировать ядро Linux с помощью сторожевого таймера или без него.
Что делает сторожевой таймер Linux? На многих() оборудовании типа x86/x86-64 есть функция, которая позволяет нам генерировать «прерывания NMI сторожевого таймера». Можно даже отключить сторожевой таймер NMI во время выполнения, написав «0» в/proc/sys/kernel/nmi_watchdog. Если какой-либо процессор в системе не выполняет прерывание локального таймера в течение более 5 секунд, APIC пытается исправить ситуацию с помощью маскирующего прерывания (процессор выполняет обработчик и убивает процесс)! (SCC Linux - это другое дело в отношении NMI.)
Мои ответы (в исходном вопросе) были основаны на системе без сторожевого таймера! Проблематично отвечать на общем уровне и приводить примеры на основе некоторой фиксированной системы. Ответы могут быть правильными или не зависят от процессора, конфигурации и настроек.
В любом случае, говорить о NMI действительно имеет смысл? Сделал это?
После долгих исследований я отвечаю на свой вопрос (кому-то это не понравилось). – SikaS