Операционная система QNX 4.Архитектура системы

       

Завершение


Процесс завершается одним из двух способов:

  • по сигналу, определяющему процесс завершения;
  • при возврате управления по функции exit()_
  • _явно, либо по функции main()_-_по умолчанию.

Завершение включает в себя две стадии:

  1. Администратор процессов инициирует выполнение завершения "по цепочке". Программа завершения входит в состав Администратора процессов и выполняется под идентификатором завершающегося процесса. При этом выполняется закрытие всех описателей открытых файлов и освобождаются:
    • все виртуальные каналы, которые имел процесс;
    • вся память, выделенная процессу;
    • все символические имена;
    • все номера основных устройств (только для администраторов ввода/вывода );
    • все обработчики прерываний;
    • все proxy;
    • все таймеры.
    • После запуска программы завершения к породившему его процессу посылается уведомление о завершении процесса (эта фаза выполняется внутри Администратора процессов).

    Если породивший процесс не выдал wait() или waitpid(), то порожденный процесс становится так называемым "зомби"-процессом и не завершается до тех пор, пока породивший процесс не выдаст wait() или не завершится сам.

    Для того, чтобы не ждать завершения порожденного процесса, следует либо установить признак _SPAWN_NOZOMBIE в функциях qnx_spawn() или qnx_spawn_option(), либо в функции signal() задать для SIGCHLD признак SIG_IGN. В этом случае порожденные процессы при завершении не становятся "зомби"-процессами.

    Породивший процесс может ожидать завершения порожденного процесса на удаленном узле. Если процесс, породивший "зомби"-процесс завершается, то освобождаются все ресурсы, связанные с "зомби".

    Если процесс завершается по сигналу завершения и при этом выполняется утилита dumper, то формируется дамп образа памяти. Этот дамп можно просмотреть с помощью символьного отладчика.

    3.3. Состояния процессов

    Процесс всегда находится в одном из следующих состояний:

    • READY (готов) - процесс может использовать центральный процессор (т.е. он не ждет наступления никакого события);
    • BLOCKED (блокирован) - процесс находится в одном из следующих состояний блокировки:
    • SEND-блокирован;
    • RECEIVE-блокирован;
    • REPLY-блокирован;
    • SIGNAL-блокирован;
    • HELD (задержан) - процесс получил сигнал SIGSTOP. До тех пор, пока он не выйдет из состояния HELD, ему не разрешается использовать центральный процессор. Вывести из состояния HELD можно либо выдачей сигнала SIGCONT, либо завершить процесс по сигналу;
    • WAIT- (ожидает) - процесс выдал wait() или waitpid() и ожидает информацию о состоянии порожденных им процессов;
    • DEAD (мертв) - процесс завершен, но не может передать информацию о своем состоянии породившему его процессу, поскольку тот не выдал функцию wait() или waitpid(). За завершенным процессом сохраняется состояние, но занимаемая им память освобождается. Процесс в состоянии DEAD также называют "зомби"-процессом.




    Более подробно состояния блокировок рассмотрены в разделе 2 "Микроядро".
    На рис. 15 представлены возможные состояния процесса в системе QNX.





    Возможные состояния процесса в системе QNX.

    Рис.15
    Определены следующие переходы из одного состояния в другое:


    1. Процесс посылает сообщение.
    2. Процесс-получатель принимает сообщение.
    3. Процесс-получатель отвечает на сообщение.
    4. Процесс ожидает сообщения.
    5. Процесс принимает сообщение.
    6. Сигнал разблокирует процесс.
    7. Сигнал пытаетcя разблокировать процесс; получатель запрашивает сообщение о захвате сигнала.
    8. Процесс-получатель принимает сигнал.
    9. Процесс ожидает завершения порожденного процесса.
    10. Порожденный процесс завершается, либо сигнал разблокирует процесс.
    11. Процессу выдан SIGSTOP.
    12. Процессу выдан SIGCONT.
    13. Процесс завершается.
    14. Порождающий процесс ожидает завершения, завершается сам или уже завершен.





    Содержание раздела