Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1179 / 142 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Лекция 10:

Заключение

Одношаговое порождение процессов

При стандартизации средств одношагового порождения процессов преследовались две основные цели:

  • возможность использования на аппаратных конфигурациях без устройства управления памятью и без какого-либо специфического оборудования;
  • совместимость с существующими POSIX-стандартами.

Чтобы достичь перечисленных целей, функции posix_spawn() и posix_spawnp() контролируют шесть видов наследуемых сущностей:

  • файловые дескрипторы;
  • идентификатор группы процессов ;
  • идентификаторы пользователя и группы процесса ;
  • параметры планирования;
  • маску сигналов;
  • способ обработки сигналов, игнорируемых родительским процессом.

Как правило, все открытые дескрипторы родительского процесса остаются таковыми и в порожденном, за исключением тех, у которых установлен флаг FD_CLOEXEC. Кроме того, принимается во внимание объект типа posix_spawn_file_actions_t, который содержит действия по закрытию, открытию и/или дублированию файловых дескрипторов. Для формирования объектов типа posix_spawn_file_actions_t служат функции posix_spawn_file_actions_addclose(), posix_spawn_file_actions_addopen() и posix_spawn_file_actions_adddup2().

За контроль других сущностей, наследуемых при одношаговом порождении процессов, отвечают атрибутные объекты, для формирования и опроса которых служат функции posix_spawnattr_init(), posix_spawnattr_destroy(), posix_spawnattr_getflags(), posix_spawnattr_setflags(), posix_spawnattr_getpgroup(), posix_spawnattr_setpgroup(), posix_spawnattr_getschedparam(), posix_spawnattr_setschedparam(), posix_spawnattr_getschedpolicy(), posix_spawnattr_setschedpolicy(), posix_spawnattr_getsigdefault(), posix_spawnattr_setsigdefault(), posix_spawnattr_getsigmask(), posix_spawnattr_setsigmask().

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

Сигналы реального времени

Приложениям реального времени требуются средства надежного, детерминированного, асинхронного извещения (уведомления) о событиях. Для удовлетворения этой потребности механизм сигналов был расширен, а в стандарт была введена необязательная часть, получившая название "сигналы реального времени" (Realtime Signals Extension, RTS).

Номера сигналов реального времени лежат в диапазоне от SIGRTMIN до SIGRTMAX. Всего таких сигналов должно быть не меньше, чем RTSIG_MAX.

"Жизненный цикл" сигналов реального времени состоит из четырех фаз:

  • генерация;
  • ожидание ;
  • доставка;
  • обработка.

Сигналы реального времени могут генерироваться при срабатывании высокоточных таймеров, завершении операции асинхронного ввода/вывода, поступлении межпроцессного сообщения, выполнении функции sigqueue() и т.д.

На фазе генерации сигналов центральную роль играет структура типа sigevent, которая, помимо прочего, определяет способ уведомления и значение сигнала.

Стандартом POSIX-2001 предусмотрено три способа уведомления об асинхронных событиях: SIGEV_NONE (отсутствие уведомления), SIGEV_SIGNAL (генерация сигнала с возможной постановкой в очередь к процессу ) и SIGEV_THREAD (вызов функции).

Значение сигнала реального времени может быть целым числом или указателем.

Сгенерировать сигнал реального времени можно, обратившись к функции sigqueue().

После того, как сигнал сгенерирован, наступает фаза ожидания. Сигналы одного типа ставятся в очередь к процессу в порядке генерации.

Дождаться доставки сигнала реального времени можно с помощью функций sigwaitinfo() и sigtimedwait().

При наличии нескольких неблокированных ждущих сигналов реального времени, их доставка процессу производится в порядке возрастания номеров. Тем самым поддерживается ранжированная по приоритетам доставка уведомлений.

Для приложений реального времени, функционирующих на аппаратных конфигурациях с ограниченными ресурсами, может оказаться полезной возможность (распространяющаяся на все сигналы) выполнять функции обработки сигналов не на основном, а на альтернативном стеке. Функция sigaltstack() позволяет установить и/или опросить характеристики альтернативного стека.

Обработка сигналов (не обязательно реального времени) нередко сочетается с нелокальными переходами. В таких случаях могут оказаться полезными функции sigsetjmp() и siglongjmp().

Часы и таймеры

Стандартом POSIX-2001 предусмотрены средства, позволяющие создавать для процессов таймеры, которые генерируют уведомления о наступлении заданного момента в виде сигналов реального времени. таймеры полезны, например, для организации периодических процессов.

Чтобы создать для процессов таймер, следует обратиться к функции timer_create().

Для удаления таймера служит функция timer_delete().

Для выполнения содержательных действий с таймерами служат функции timer_gettime(), timer_settime() и timer_getoverrun().

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

Для приложений реального времени важна возможность использования не только процессорных, но и монотонных часов. В основном из этих соображений в стандарте POSIX-2001 присутствует расширенный аналог рассмотренной в курсе [1] функции nanosleep()clock_nanosleep().