|Супутник-породжувач+----------+ Супутник-нащадок| |
| +-------------------+ +-----------------+ |
| - - |
+-------------------------------------------------------+
- -
+----------------------------+ +---------------------------+
| - | | - |
| +------------------------+ | | +----------------------+ |
| | Периферійний породжувач| | | | Периферійни нащадок | |
| +------------------------+ | | +----------------------+ |
+----------------------------+ +---------------------------+
Периферійний процесор Периферійний процесор
Малюнок 13.6. Виконання функції fork на периферійному процесорі
І в багатопроцесорній, і в однопроцесорній системах процес повинен реагувати на сигнали однаково: процес або завершує виконання системної функції до перевірки сигналів, або, навпроти, одержавши сигнал, не чекаючи виходить зі стану зупинки й різко перериває роботу системної функції, якщо це погоджується із пріоритетом, з яким він був припинений.
Оскільки процес-супутник виконує системні функції від імені периферійного процесу, він повинен реагувати на сигнали, узгоджуючи свої дії з посліднім. Якщо в однопроцесорній системі сигнал змушує процес завершити виконання функції аварійно, процесу-супутникові в багатопроцесорній системі варто поводитися тим же чином. Те ж саме можна сказати й про той випадок, коли сигнал спонукає процес до завершення своєї роботи за допомогою функції exit: периферійний процес завершується й посилає відповідне повідомлення процесу-супутникові, що, зрозуміло, теж завершується.
Коли периферійний процес викликає системну функцію signal, він зберігає поточну інформацію в локальних таблицях і посилає повідомлення своєму
супутникові, інформуючи його про те, чи треба зазначений сигнал приймати або ж ігнорувати. Процесу-супутникові байдуже, чи виконувати перехоплення сигналу чи діяти за замовчуванням. Реакція процесу на сигнал залежить від трьох факторів (Малюнок 13.7): чи надходить сигнал під час виконання процесом системної функції, чи зроблено за допомогою функції signal вказівка про ігнорування сигналу, чи виникає сигнал на цьому ж периферійному процесорі або на
+------------------------------------------------------------+
| алгоритм sighandle /* алгоритм обробки сигналів */ |
| вхідна інформація: відсутній |
| вихідна інформація: відсутній |
| { |
| якщо (поточний процес є чиїмось супутником або |
| має прототип) |
| { |
| якщо (сигнал ігнорується) |
| повернути керування; |
| якщо (сигнал надійшов під час виконання системної |
| функції) |
| поставити сигнал перед процесом-супутником; |
| у противному випадку |
| послати повідомлення про сигнал периферійному |
| процесу; |
| } |
| у противному випадку /* периферійний процес */ |
| { |
| /* чи надійшов сигнал під час виконання системної |
| * функції чи ні |
| */ |
| послати сигнал процесу-супутнику; |
| } |
| } |
| |
| алгоритм satellite_end_of_syscall /* завершення систем- |
| * ної функції, виз- |
| * ваної периферійним |
| * процесом */ |
| вхідна інформація: відсутній |
| вихідна інформація: відсутній |
| { |
| якщо (під час виконання системної функції надійшло |
| переривання) |
| послати периферійному процесу повідомлення про |
| переривання, сигнал; |
| у противному випадку /* виконання системної функції не|
| * переривалося */ |
| послати відповідь: включити прапор, що показує |
| поступлення сигналу; |
| } |
+------------------------------------------------------------+
Малюнок 13.7. Обробка сигналів у периферійній системі
якомусь іншому. Перейдемо до розгляду різних можливостей.
Допустимо, що периферійний процес призупинив свою роботу на той час, поки процес-супутник виконує системну функцію від його імені. Якщо сигнал виникає в іншому місці, процес-супутник виявляє його раніше, ніж периферійний процес. Можливі три випадки.
1. Якщо чекаючи деякої події процес-супутник не переходив у стан зупинки, з якого він вийшов би після одержання сигналу, він виконує системну функцію до кінця, посилає результати виконання периферійному процесу й показує, який із сигналів ним був отриманий.
2. Якщо процес зробив вказівку про ігнорування сигналу даного типу, супутник продовжує додержуватися алгоритму виконання системної функції, не виходячи зі стану зупинки по longjmp. У відповіді, що посилається периферійному процесу, повідомлення про одержання сигналу буде відсутнє.
3. Якщо після одержання сигналу процес-супутник перериває виконання системної функції (по longjmp), він інформує про це периферійний процес і повідомляє йому номер сигналу.
Периферійний процес шукає у відповіді, що надійшла, відомості про одержання сигналів й у випадку виявлення таких, робить обробку сигналів перед виходом із системної функції. Таким чином, поводження процесу в багатопроцесорній системі в точності відповідає його поводженню в однопроцесорній системі: він або завершує свою роботу, не виходячи з режиму ядра, або звертається до користувальницької функції обробки сигналу, або ігнорує сигнал й успішно завершує виконання системної функції.
Периферійний процес Процес-супутник
+----------------------------------------------------------
| Викликає системну функцію read -
| Посилає повідомлення про виклик функції -
| процесу-супутникові -
| Припиняється до одержання -
| відповіді від процесу-супутника Одержує повідомлення
| - про виклик системної
| - функції read
| - Читає дані з тер-
| - міналу
| - Припиняється в
| - очікуванні одержання
| - порції даних
| - -
| - -
| - Сигнал (користувач
| - нажав клавішу "break")
| - Виходить зі стану
| - призупинки
| - Припиняє виконання
| - системної функції
| - Посилає відповідь пери-
| - ферійному процесу:
| - виконання функції
| - перервано
| Виходить зі стану призупинки
| Аналізує відповідь
v Обробляє сигнал
Малюнок 13.8. Переривання під час виконання системної функції
Припустимо, наприклад, що периферійний процес викликає функцію читання з термінала, пов'язаного із центральним процесором, і припиняє свою роботу на час виконання функції процесом-супутником (Малюнок 13.8). Якщо