Міжпроцесорне переривання

Міжпроцесорне переривання (англ. inter-processor interrupt, IPI) — спеціальний тип переривання, за допомогою якого один процесор може надсилати спеціальні повідомлення іншим процесорам багатопроцесорної обчислювальної системи. Прикладами таких повідомлень або запитів можуть бути

  • запит MMU на синхронізацію кешів (таких як TLB) на інших процесорах, у випадку, коли один з процесорів змінив відображення (англ. mapping) пам'яті;
  • старт або зупинка процесорів або ядер.

Історія

ред.

Спеціальна версія M65MP операційної системи OS/360 використовувала так зване «пряме керування» (англ. Direct Control feature) машини IBM System/360, щоб згенерувати переривання у іншому процесорі.[1] Більш формалізований інтерфейс у вигляді спеціальної інструкції SIGNAL PROCESSOR з'явився у IBM System/370[2], і продовжує використовуватися у z/Architecture.

Архітектура x86

ред.

У IBM PC-сумісних комп'ютерах, що мають контролер переривань APIC, надсилання міжпроцесорних переривань часто здійснюється саме за допомогою APIC. Коли процесорові треба надіслати переривання до іншого процесора, вектор переривань і ідентифікатор LAPIC цільового процесора програмується у спеціальний регістр ICR (англ. Interrupt Command Register) «свого» контролера APIC. Після цього «свій» APIC надсилає повідомлення цільовому контролерові APIC, який викликає переривання потрібного процесора чи ядра.

Архітектура ARM

ред.

У сучасних процесорах архітектури ARM надсилання міжпроцесорних переривань здійснюється за допомогою контролера переривань GIC.[3] Зокрема, механізм IPI потрібен для запуску процесорних ядер: після початкового запуску системи команди виконує лише одне «основне» ядро (англ. primary core); всі інші ядра знаходяться у стані «чекання на переривання» (у цей стан ядро переводиться інструкцією WFI, англ. Wait For Interrupt). Для того, щоб запустити допоміжне ядро, у GIC треба запрограмувати початкову адресу виконання, а потім (теж за допомогою GIC) надіслати цільовому ядру програмно-генероване переривання (англ. Software Generated Interrupt, SGI).[3]

Приклади використання у операційних системах

ред.

У багатопроцесорній системі під керуванням Microsoft Windows процесор може переривати інший процесор з наступних причин (на додачу до вже наведених вище):

  1. запит на диспетчеризацію переривання (DISPATCH_LEVEL), що в підсумку запускає новий потік виконання;
  2. точка зупину налагоджувача ядра[en].

У Microsoft Windows міжпроцесорні переривання мають IRQL 29.[4]

Див. також

ред.

Джерела

ред.
  1. IBM System/360 Operating System Introduction (PDF) (англ.). IBM. June 1971. Архів оригіналу (PDF) за 2 квітня 2020. Процитовано 27 січня 2020.
  2. IBM System/370 Extended Architecture. Principles of Operation (PDF) (англ.). IBM. March 1983. Архів оригіналу (PDF) за 29 вересня 2019. Процитовано 28 січня 2020.
  3. а б Cortex-A Series Programmer’s Guide. 4.0 (англ.). ARM. Архів оригіналу за 28 червня 2020. Процитовано 29 червня 2022.
  4. Matt (28 квітня 2002). Understanding IRQL (англ.). Архів оригіналу за 14 жовтня 2019. Процитовано 6 грудня 2014.