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

Міжпроцесорне переривання (англ. 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. точка зупину налагоджувача ядра.

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

Див. також

Джерела

  1. IBM System/360 Operating System Introduction (англ.). IBM. June 1971.
  2. IBM System/370 Extended Architecture. Principles of Operation (англ.). IBM. March 1983.
  3. Cortex-A Series Programmer’s Guide. 4.0 (англ.). ARM.
  4. Matt (28 квітня 2002). Understanding IRQL (англ.). Процитовано 6 грудня 2014.
  5. Interrupts and Exceptions (англ.).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.