Как происходит процесс отключения прерывания в многопроцессорной системе? - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть утверждение из учебника о том, что отключение прерывания не рекомендуется в многопроцессорной системе, и это займет слишком много времени.Но я этого не понимаю, может кто-нибудь показать мне процесс многопроцессорной системы, отключающей прерывания?Спасибо

1 Ответ

0 голосов
/ 25 декабря 2018

на x86 (и других архитектурах, AFAIK), включение / отключение прерываний для каждого ядра.Вы не можете глобально отключить прерывания на всех ядрах.

Программное обеспечение может обмениваться данными между ядрами с межпроцессорными прерываниями (IPI) или атомарными общими переменными, но даже в этом случае было бы очень дорого организовать размещение всех ядер.в спин-петле, ожидающей уведомления от этого ядра, что они могут повторно включить прерывания.(Прерывания отключены на других ядрах, поэтому вы не можете отправить им IPI, чтобы сообщить им, когда закончите свой блок атомарных операций.) Вы должны прерывать все остальные 7 ядер (например, на 8-сторонней SMP).система), со многими циклами двусторонней связи.

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


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

Но я думаю, что моя путаница заключается в том, что для меня разница между 1 ядром и 8 ядром для меня невелика;почему отключение всех из них от прерывания отнимает много времени.

Все, кроме однопроцессорного, является принципиальным качественным отличием, а не количественным .Даже двухъядерные системы, такие как ранние многоядерные системы x86 и первые двухъядерные системы x86, полностью изменяют ваш подход к атомарности.Вы должны фактически взять блокировку или что-то вместо того, чтобы просто отключать прерывания(Например, ранний Linux имел «большую блокировку ядра», от которой зависело многое, до того, как у него была детальная блокировка для отдельных вещей, которые не конфликтовали друг с другом.)

ФундаментальныйРазница заключается в том, что в системе UP только прерывания на текущем процессоре могут привести к асинхронным изменениям, выполняемым текущим кодом.(Или DMA от устройств ...)

В системе SMP другие ядра могут делать свое дело одновременно .


Для многопоточности, получая атомарностьдля блока инструкций отключение прерываний на текущем процессоре совершенно неэффективно;потоки могут выполняться на других процессорах.

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

...