Функции управления процессами
· signal()
#include <signal.h>.
static void sig_hndl(int signo) // обработчик
{
signal (SIGINT, sig_hndl); // восстановление диспозиции, требуется не всегда
printf(“This is new handler for SIGINT\n”); // сообщение обработчика
}
main()
{
signal(SIGINT, sig_hndl); // смена диспозиции трёх сигналов
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_IGN);
while(1)
pause();
}
$ a.out & - можно пользоваться этим терминалом
5050 - pid порождённого процесса
$ kill SIGINT 5050
This is new handler for SIGINT
$ kill SIGUSR2 5050 - ничего не произойдет
$ kill SIGUSR1 5050 - действие по умолчанию (процесс терминируется).
Функция управления сигналами в POSIX
· sigaction(2)
Набор сигналов – sigset_t (32 разряда – 32 сигнала). Маскирование сигналов.
Реализация функции sigaction различно в различных ОС (меняется структура, которая ей управляет).
#include <signal.h>
int sigaction (int sig, const struct sigaction *act, const struct sigaction *oldact)
Поля структуры sigaction:
- void (*sa_handler) ()
- void (*sa_sigaction) (int, siginfo_t*, void*)
- sigset_t sa_mask; // маска
- int sa_flags; // флаги
Если sa_handler <> 0 или sa_sigaction <> 0, то в поле sa_mask передаётся набор сигналов, которые будут добавлены к маске перед вызовом обработчика. Маска блокирует сигналы, которые в неё добавлены. После возврата из обработчика маска восстанавливается. Обрабатываемый сигнал блокируется. Нет очередей сигналов. sa_flags модифицирует доставку сигналов.
siginfo_t – структура-комментарий о сигнале.
#include <siginfo_t.h>
struct siginfo_t{
int sig_no; // номер сигнала
int sig_errno; // номер ошибки
int sig_code; // причина отправки сигнала
};
Функции управления sigaction()
#include <signal.h>
sigemptyset(sig_set_t *set); // начальная инициализация, очистка битов
sigfillset(sig_set_t *set); // включение битов
sigaddset(sig_set_t *set, int signo); // добавить 1 сигнал
sigdelset(sig_set_t *set, int signo); // убрать 1 сигнал
sigismemberset(sig_set_t *set, int signo); // является ли сигнал в маске
Ресурсоемкость сигналов
Для отправки-доставки требуется системный вызов.
Для доставки – прерывание и его обработка.
Для этого необходимо большое число операций со стеком - копирование пользовательского стека в системную область, извлечение параметров системных вызовов, результатов работы системных вызовов и др. Вывод: затраты слишком велики по сравнению с объемом передаваемой информации.
Используются для реакции на событие.
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void (*oursignal (int signo, void (*hndlr)(int)) (int) // обработчик
{
struct sigaction act, oldact;
act.sa_handler = hndlr;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (signo != SIGALARM) act.sa_flags |= SA_RESTART;
if (sigaction (signo, &act, &oldact) < 0) return (SIG_ERR);
return (oldact.sa_hndlr);
}
static void sig_hndlr (int signo);
{
printf(“We are int handler\n”); // нет восстановления старой диспозиции
}
main()
{
oursignal(SIGINT, sig_hndl); // смена диспозиции трёх сигналов
oursignal(SIGUSR1, SIG_DFL);
oursignal(SIGUSR2, SIG_IGN);
while(1)
pause();
}
Сообщения в микроядерных ОС.
В микроядерных ОС средства сообщений – базовые средства IPC. Универсальны для локальных и сетевых вариантов. Нет необходимости редиректора.
POSIX <= есть в микроядерных системах.
Это средство реализовано как надстройка над родными средствами сообщений.
В СРВ есть требование точного выполнения в заданные сроки – механизм send msg – с квитированием.
Количество блокировок сильно возрастает в общем перечне состояний процесса
[send – receive – reply]
Общие затраты ресурсов на общую передачу сообщений невелики.
Количество передач сообщений огромно (всё взаимодействие посредством сообщений с квитированием).
Типы:
- send-управляемая передача сообщений
- receive-управляемая передача сообщений
В зависимости от типа меняется структура клиент-серверного приложения.
Процессы и потоки в WinNT
Основная модель функционирования – объектная. Основная часть ОС написана на языке C. Ресурсы представляются объектами (в т.ч. процессы, файлы). Процессы создаются и реализуются как объекты -> доступ посредством объектных сервисов. В адресном пространстве процесса может быть несколько потоков. Есть встроенные средства синхронизации. Для базового процесса не поддерживается наследование
Состав процесса
- исполняемая программа (код + данные)
- закрытое адресное пространство (набор адресов в виртуальной памяти)
- системные ресурсы (то, что выделяется ОС для выполнения программы)
- хотя бы один поток выполнения.
Поток внутри процесса – сущность, управляемая ОС.
Адресное пространство – все ограничения вносятся системой виртуальной памяти. Процессы получают логический образ (окружение потока + пользовательская часть).
Виртуализация – отображение виртуальной памяти в физическую.
Собственное АП процессов изолировано от других -> нужны средства IPC. Здесь это сделано в виде иерархии.
API защищённой подсистемы – серверы.
- упрощение базовой системы
- расширение функциональности
Подсистемы находятся в пользовательском режиме (представлены в виде ограниченного набора ф-й).
Клиент-серверная модель – защищённая подсистема определяет набор требуемых функций. Через них эти функции и вызываются. У процесса есть маркер доступа.
Таблица описателей.
Описатели – набор структур, созданных диспетчером. Он играет роль посредника для процесса, чтобы читать и писать в виртуальном АП.
Маркер доступа также является объектом. Создаётся и уничтожается диспетчером. Открытие описателя маркера доступа выполняется по специальным правам. Маркер содержит заголовок объекта – атрибуты (дескриптор защиты), имя процесса, каталог объектов.
Дополнительные ресурсы – базовый приоритет, процессорное сродство, набор квот на ресурсы. Могут наследоваться.
Атрибуты объекта | Назначение |
ID | Уникальный определитель |
Маркер доступа | Объект, содержащий информацию о правах процесса |
Базовый приоритет | Базовый приоритет основного потока |
Процессорное сродство | Набор процессоров, на которых потоки-процессы могут исполняться по умолчанию |
Размер квот | Мах V резидентной/нерезидентной системной памяти – пространство в файле подкачки, например процессорное время, выделенное процессу. |
Время выполнения | Общее время выполнения всех потоков |
Счётчик ввода/вывода | Переменная, в которой сохраняется число и тип операций ввода/вывода процессов |
Счётчик операций вирт. памяти | Переменная, в которой сохраняется число и тип операций виртуальной памяти |
Код отладки | Канал коммуникации между процессами |
Код завершения | Причина завершения процесса |
Атрибуты определяет диспетчер процессов. Атрибуты формируют ограничения на потоки процессов. Приоритеты потоков регулируются ядром NT.
Общее у потока и процесса: АП, маркер доступа, базовый приоритет, описатель объекта.
Для потока-объекта есть свои атрибуты.
Атрибуты объекта | Назначение |
Клиентский ID | Уникальный определитель потока |
Контекст потока | Набор значений регистров и другие непосредственные данные, определяющие состояние потока |
Динамический приоритет | Приоритет на данное время |
Базовый приоритет | Нижний предел приоритета |
Процессорное сродство потока | Набор процессоров, на которых может выполняться данный поток |
Время выполнения потока | Общее время выполнения потока в режиме ядра и в режиме задачи |
Статус оповещения | Наличие асинхронного вызова (процедура APC) |
Счётчик приостановок | Количество остановок выполнения потока без возобновления |
Маркер имперсонации (SUID) | Временный маркер доступа от имени другого потока |
Код отладки | Канал коммуникации |
Код завершения | Причина завершения потока |
Приоритеты 16-31 – приоритеты РВ (нет связи с СРВ) – событийное реагирование.